RealtimeStyleTransferRuntime/Source/LyraGame/AbilitySystem/LyraGameplayCueManager.h

75 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameplayCueManager.h"
#include "LyraGameplayCueManager.generated.h"
/**
* ULyraGameplayCueManager
*
* Game-specific manager for gameplay cues
*/
UCLASS()
class ULyraGameplayCueManager : public UGameplayCueManager
{
GENERATED_BODY()
public:
ULyraGameplayCueManager(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
static ULyraGameplayCueManager* Get();
//~UGameplayCueManager interface
virtual void OnCreated() override;
virtual bool ShouldAsyncLoadRuntimeObjectLibraries() const override;
virtual bool ShouldSyncLoadMissingGameplayCues() const override;
virtual bool ShouldAsyncLoadMissingGameplayCues() const override;
//~End of UGameplayCueManager interface
static void DumpGameplayCues(const TArray<FString>& Args);
// When delay loading cues, this will load the cues that must be always loaded anyway
void LoadAlwaysLoadedCues();
// Updates the bundles for the singular gameplay cue primary asset
void RefreshGameplayCuePrimaryAsset();
private:
void OnGameplayTagLoaded(const FGameplayTag& Tag);
void HandlePostGarbageCollect();
void ProcessLoadedTags();
void ProcessTagToPreload(const FGameplayTag& Tag, UObject* OwningObject);
void OnPreloadCueComplete(FSoftObjectPath Path, TWeakObjectPtr<UObject> OwningObject, bool bAlwaysLoadedCue);
void RegisterPreloadedCue(UClass* LoadedGameplayCueClass, UObject* OwningObject);
void HandlePostLoadMap(UWorld* NewWorld);
void UpdateDelayLoadDelegateListeners();
bool ShouldDelayLoadGameplayCues() const;
private:
struct FLoadedGameplayTagToProcessData
{
FGameplayTag Tag;
TWeakObjectPtr<UObject> WeakOwner;
FLoadedGameplayTagToProcessData() {}
FLoadedGameplayTagToProcessData(const FGameplayTag& InTag, const TWeakObjectPtr<UObject>& InWeakOwner) : Tag(InTag), WeakOwner(InWeakOwner) {}
};
private:
// Cues that were preloaded on the client due to being referenced by content
UPROPERTY(transient)
TSet<UClass*> PreloadedCues;
TMap<FObjectKey, TSet<FObjectKey>> PreloadedCueReferencers;
// Cues that were preloaded on the client and will always be loaded (code referenced or explicitly always loaded)
UPROPERTY(transient)
TSet<UClass*> AlwaysLoadedCues;
TArray<FLoadedGameplayTagToProcessData> LoadedGameplayTagsToProcess;
FCriticalSection LoadedGameplayTagsToProcessCS;
bool bProcessLoadedTagsAfterGC = false;
};