89 lines
2.8 KiB
C++
89 lines
2.8 KiB
C++
// 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<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<TObjectPtr<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<TObjectPtr<UClass>> AlwaysLoadedCues;
|
|
|
|
TArray<FLoadedGameplayTagToProcessData> LoadedGameplayTagsToProcess;
|
|
FCriticalSection LoadedGameplayTagsToProcessCS;
|
|
bool bProcessLoadedTagsAfterGC = false;
|
|
};
|