Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
DataAssetManager.h
이 파일의 문서화 페이지로 가기
1#pragma once
2
3#include "CoreMinimal.h"
4#include "Engine/AssetManager.h"
6#include "DataAssetManager.generated.h"
7
9
10
11DECLARE_DELEGATE_TwoParams(FAsyncLoadCompletedDelegate, const FName&/*AssetName or Label*/, UObject*/*LoadedAsset*/);
12
13
20USTRUCT()
22{
23 GENERATED_BODY()
24
25 UPROPERTY(Transient)
26 TArray<TObjectPtr<UPrimaryDataAsset>> Assets;
27};
28
32UCLASS(Blueprintable)
33class CK_UE_API UDataAssetManager : public UAssetManager
34{
35 GENERATED_BODY()
36
37public:
39
40public:
41 static UDataAssetManager& GetInstance();
42
43 static void DumpLoadedAssets();
44
52 static void RegisterBundleAssets(const TArray<UObject*>& InAssets);
53
61 static void UnregisterBundleAssets(const TArray<UObject*>& InAssets);
62
63
64public:
65 template <typename TData>
66 static TData* GetAsset(const TSoftObjectPtr<TData>& AssetPointer, bool bKeepInMemory = true);
67
68 template <typename TData>
69 static TSubclassOf<TData> GetSubclass(const TSoftClassPtr<TData>& AssetPointer, bool bKeepInMemory = true);
70
71 static void LoadAsyncByPath(const FSoftObjectPath& AssetPath, FAsyncLoadCompletedDelegate CompletedDelegate = FAsyncLoadCompletedDelegate());
72 static void LoadAsyncByName(const FName& AssetName, FAsyncLoadCompletedDelegate CompletedDelegate = FAsyncLoadCompletedDelegate());
73
74
75protected:
76 static UObject* SynchronousLoadAsset(const FSoftObjectPath& AssetPath);
77 static bool ShouldLogAssetLoads();
78
79 template <typename TData>
80 const TData& GetOrLoadTypedGameData(const TSoftObjectPtr<TData>& DataPath);
81
82 template <typename TData>
83 TArray<const TData*> GetAllTypedGameData() const;
84
85
86protected:
87 UFUNCTION(BlueprintNativeEvent, Category = "DataAssetManager")
88 void InitializeOnManager();
89
90 UFUNCTION(BlueprintNativeEvent, Category = "DataAssetManager")
91 void OnUpdateLoadPercentage(float Percentage);
92
93 UFUNCTION(BlueprintNativeEvent, Category = "DataAssetManager")
94 void OnAllDataLoadCompleted();
95
96 virtual void TryCreateLoadJobForDataAsset(TSoftObjectPtr<UPrimaryDataAsset> DataPath, FString JobName);
97 virtual void StartInitialLoading() override;
98
99 UPrimaryDataAsset* LoadGameDataOfClass(TSubclassOf<UPrimaryDataAsset> DataClass, const TSoftObjectPtr<UPrimaryDataAsset>& DataClassPath, FPrimaryAssetType PrimaryAssetType);
100
101
102#if WITH_EDITOR
103 virtual void PreBeginPIE(bool bStartSimulate) override;
104#endif
105
106protected:
107 UPROPERTY(Transient)
108 TMap<TObjectPtr<UClass>, FGameDataAssetList> GameDataMap;
109
110 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "GameData")
111 TArray<TSoftObjectPtr<UPrimaryDataAsset>> InitialGameDataPaths;
112
113 UPROPERTY()
115
116private:
117 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "DataAssetManager", meta = (AllowPrivateAccess = "true"))
118 TSet<TObjectPtr<UObject>> LoadedAssets;
119};
120
121
122#pragma region Static Template Functions
123
124template <typename AssetType>
125AssetType* UDataAssetManager::GetAsset(const TSoftObjectPtr<AssetType>& AssetPointer, bool bKeepInMemory)
126{
127 AssetType* LoadedAsset = nullptr;
128 const FSoftObjectPath& AssetPath = AssetPointer.ToSoftObjectPath();
129
130 if (AssetPath.IsNull())
131 {
132 return LoadedAsset;
133 }
134
135 LoadedAsset = AssetPointer.Get();
136
137 if (LoadedAsset == nullptr)
138 {
139 LoadedAsset = Cast<AssetType>(SynchronousLoadAsset(AssetPath));
140 ensureAlwaysMsgf(LoadedAsset, TEXT("Failed to load asset [%s]"), *AssetPointer.ToString());
141 }
142
143 if (LoadedAsset && bKeepInMemory)
144 {
145 GetInstance().LoadedAssets.Add(Cast<UObject>(LoadedAsset));
146 }
147
148 return LoadedAsset;
149}
150
151
152template <typename AssetType>
153TSubclassOf<AssetType> UDataAssetManager::GetSubclass(const TSoftClassPtr<AssetType>& AssetPointer, bool bKeepInMemory)
154{
155 TSubclassOf<AssetType> LoadedSubclass;
156 const FSoftObjectPath& AssetPath = AssetPointer.ToSoftObjectPath();
157
158 if (AssetPath.IsNull())
159 {
160 return LoadedSubclass;
161 }
162
163 LoadedSubclass = AssetPointer.Get();
164
165 if (LoadedSubclass == nullptr)
166 {
167 LoadedSubclass = Cast<UClass>(SynchronousLoadAsset(AssetPath));
168 ensureAlwaysMsgf(LoadedSubclass, TEXT("Failed to load asset class [%s]"), *AssetPointer.ToString());
169 }
170
171 if (LoadedSubclass && bKeepInMemory)
172 {
173 GetInstance().LoadedAssets.Add(Cast<UObject>(LoadedSubclass));
174 }
175
176 return LoadedSubclass;
177}
178
179
180template <typename GameDataClass>
181const GameDataClass& UDataAssetManager::GetOrLoadTypedGameData(const TSoftObjectPtr<GameDataClass>& DataPath)
182{
183 if (auto* pResult = GameDataMap.Find(GameDataClass::StaticClass()))
184 {
185 if (pResult->Assets.IsEmpty() == false)
186 {
187 return *CastChecked<GameDataClass>(pResult->Assets[0]);
188 }
189 }
190
191 return *CastChecked<const GameDataClass>(LoadGameDataOfClass(GameDataClass::StaticClass(), DataPath, GameDataClass::StaticClass()->GetFName()));
192}
193
194
195template <typename GameDataClass>
196TArray<const GameDataClass*> UDataAssetManager::GetAllTypedGameData() const
197{
198 TArray<const GameDataClass*> Result;
199
200 const auto* pResult = GameDataMap.Find(GameDataClass::StaticClass());
201
202 if (pResult == nullptr)
203 {
204 return Result;
205 }
206
207 for (const TObjectPtr<UPrimaryDataAsset>& Asset : pResult->Assets)
208 {
209 if (const GameDataClass* Typed = Cast<GameDataClass>(Asset))
210 {
211 Result.Add(Typed);
212 }
213 }
214
215 return Result;
216}
217
218#pragma endregion
DECLARE_DELEGATE_TwoParams(FAsyncLoadCompletedDelegate, const FName &, UObject *)
Definition DataAssetManager.h:34
static TData * GetAsset(const TSoftObjectPtr< TData > &AssetPointer, bool bKeepInMemory=true)
static TSubclassOf< TData > GetSubclass(const TSoftClassPtr< TData > &AssetPointer, bool bKeepInMemory=true)
UPrimaryDataAsset * LoadGameDataOfClass(TSubclassOf< UPrimaryDataAsset > DataClass, const TSoftObjectPtr< UPrimaryDataAsset > &DataClassPath, FPrimaryAssetType PrimaryAssetType)
지정한 클래스 타입의 게임 데이터 에셋을 동기 로드하고 GameDataMap에 등록합니다.
Definition DataAssetManager.cpp:315
TArray< const TData * > GetAllTypedGameData() const
const TData & GetOrLoadTypedGameData(const TSoftObjectPtr< TData > &DataPath)
TSet< TObjectPtr< UObject > > LoadedAssets
Definition DataAssetManager.h:118
static UDataAssetManager & GetInstance()
UDataAssetManager 싱글턴 인스턴스를 반환합니다.
Definition DataAssetManager.cpp:22
TMap< TObjectPtr< UClass >, FGameDataAssetList > GameDataMap
Definition DataAssetManager.h:108
static UObject * SynchronousLoadAsset(const FSoftObjectPath &AssetPath)
소프트 오브젝트 경로로 에셋을 동기 로드합니다.
Definition DataAssetManager.cpp:127
Definition DataAssetJobManager.h:10
Definition DataAssetLoadJob.h:8
FString JobName
Definition DataAssetLoadJob.h:20
GameDataMap의 TMap Value 래퍼 구조체.
Definition DataAssetManager.h:22