// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/Array.h" #include "Containers/Map.h" #include "Containers/Set.h" #include "GameplayCueManager.h" #include "GameplayTagContainer.h" #include "HAL/CriticalSection.h" #include "UObject/SoftObjectPath.h" #include "UObject/UObjectGlobals.h" #include "UObject/WeakObjectPtr.h" #include "UObject/WeakObjectPtrTemplates.h" #include "LyraGameplayCueManager.generated.h" class FString; class UClass; class UObject; class UWorld; struct FObjectKey; /** * 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& 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 OwningObject, bool bAlwaysLoadedCue); void RegisterPreloadedCue(UClass* LoadedGameplayCueClass, UObject* OwningObject); void HandlePostLoadMap(UWorld* NewWorld); void UpdateDelayLoadDelegateListeners(); bool ShouldDelayLoadGameplayCues() const; private: struct FLoadedGameplayTagToProcessData { FGameplayTag Tag; TWeakObjectPtr WeakOwner; FLoadedGameplayTagToProcessData() {} FLoadedGameplayTagToProcessData(const FGameplayTag& InTag, const TWeakObjectPtr& InWeakOwner) : Tag(InTag), WeakOwner(InWeakOwner) {} }; private: // Cues that were preloaded on the client due to being referenced by content UPROPERTY(transient) TSet> PreloadedCues; TMap> PreloadedCueReferencers; // Cues that were preloaded on the client and will always be loaded (code referenced or explicitly always loaded) UPROPERTY(transient) TSet> AlwaysLoadedCues; TArray LoadedGameplayTagsToProcess; FCriticalSection LoadedGameplayTagsToProcessCS; bool bProcessLoadedTagsAfterGC = false; };