Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
DataAssetManager.h
이 파일의 문서화 페이지로 가기
1#pragma once
2
3#include "CoreMinimal.h"
4#include "CK_UE.h"
5#include "Engine/AssetManager.h"
7#include "DataAssetManager.generated.h"
8
11
12
13DECLARE_DELEGATE_TwoParams(FAsyncLoadCompletedDelegate, const FName&/*AssetName or Label*/, UObject*/*LoadedAsset*/);
14DECLARE_DELEGATE_OneParam(FAsyncBatchLoadCompletedDelegate, const TArray<UObject*>& /*LoadedAssets*/);
15
16
23USTRUCT()
25{
26 GENERATED_BODY()
27
28public:
29 UPROPERTY(Transient)
30 TArray<TObjectPtr<UPrimaryDataAsset>> Assets;
31};
32
36UCLASS(Blueprintable)
37class CK_UE_API UDataAssetManager : public UAssetManager
38{
39 GENERATED_BODY()
40
41public:
43
44public:
45 static UDataAssetManager& GetInstance();
46
48 template <typename TData>
49 static TData* GetAssetByType();
50
52 template <typename TData>
53 static TArray<TData*> GetAllAssetsByType();
54
55 template <typename TData>
56 static void LoadAllPrimaryAssetsAsyncInPath(const FString& FolderPath, FAsyncBatchLoadCompletedDelegate CompletedDelegate = FAsyncBatchLoadCompletedDelegate());
57
58 static void LoadAsyncByPath(const FSoftObjectPath& AssetPath, FAsyncLoadCompletedDelegate CompletedDelegate = FAsyncLoadCompletedDelegate());
59 static void LoadAsyncByName(const FName& AssetName, FAsyncLoadCompletedDelegate CompletedDelegate = FAsyncLoadCompletedDelegate());
60
61 static UObject* SynchronousLoadAsset(const FSoftObjectPath& AssetPath);
62
63
64public:
65 virtual void StartInitialLoading() override;
66
67
68protected:
69 template <typename TData>
70 const TData& GetOrLoadTypedGameData(const TSoftObjectPtr<TData>& DataPath);
71
72 template <typename TData>
73 TArray<const TData*> GetAllTypedGameData() const;
74
75
76protected:
77 UFUNCTION(BlueprintNativeEvent, Category = "DataAssetManager")
78 void OnUpdateLoadPercentage(float Percentage);
79
80 virtual void TryCreateLoadJobForDataAsset(TSoftObjectPtr<UPrimaryDataAsset> DataPath, FString JobName);
81 UPrimaryDataAsset* LoadGameDataOfClass(TSubclassOf<UPrimaryDataAsset> DataClass, const TSoftObjectPtr<UPrimaryDataAsset>& DataClassPath, FPrimaryAssetType PrimaryAssetType);
82
83
84protected:
85 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = GameData)
86 TSoftObjectPtr<IDataAssetBundle> InitialBundlePath;
87
88 UPROPERTY(Transient)
89 TMap<TObjectPtr<UClass>, FGameDataAssetList> GameDataMap;
90
91 UPROPERTY()
93
94private:
96 TMap<FName, FSoftObjectPath> PrimaryAssetNameCache;
97};
98
99
100#pragma region Static Template Functions
101
102template <typename TData>
104{
105 const FGameDataAssetList* List = GetInstance().GameDataMap.Find(TData::StaticClass());
106
107 if (List == nullptr || List->Assets.IsEmpty())
108 {
109 return nullptr;
110 }
111
112 return Cast<TData>(List->Assets[0]);
113}
114
115
116template <typename TData>
118{
119 TArray<TData*> Result;
120
121 const FGameDataAssetList* List = GetInstance().GameDataMap.Find(TData::StaticClass());
122
123 if (List == nullptr)
124 {
125 return Result;
126 }
127
128 for (const TObjectPtr<UPrimaryDataAsset>& Asset : List->Assets)
129 {
130 if (TData* Typed = Cast<TData>(Asset))
131 {
132 Result.Add(Typed);
133 }
134 }
135
136 return Result;
137}
138
139
140template <typename GameDataClass>
141const GameDataClass& UDataAssetManager::GetOrLoadTypedGameData(const TSoftObjectPtr<GameDataClass>& DataPath)
142{
143 if (auto* pResult = GameDataMap.Find(GameDataClass::StaticClass()))
144 {
145 if (pResult->Assets.IsEmpty() == false)
146 {
147 return *CastChecked<GameDataClass>(pResult->Assets[0]);
148 }
149 }
150
151 return *CastChecked<const GameDataClass>(LoadGameDataOfClass(GameDataClass::StaticClass(), DataPath, GameDataClass::StaticClass()->GetFName()));
152}
153
154
155template <typename GameDataClass>
156TArray<const GameDataClass*> UDataAssetManager::GetAllTypedGameData() const
157{
158 TArray<const GameDataClass*> Result;
159
160 const auto* pResult = GameDataMap.Find(GameDataClass::StaticClass());
161
162 if (pResult == nullptr)
163 {
164 return Result;
165 }
166
167 for (const TObjectPtr<UPrimaryDataAsset>& Asset : pResult->Assets)
168 {
169 if (const GameDataClass* Typed = Cast<GameDataClass>(Asset))
170 {
171 Result.Add(Typed);
172 }
173 }
174
175 return Result;
176}
177
188template <typename TData>
189void UDataAssetManager::LoadAllPrimaryAssetsAsyncInPath(const FString& FolderPath, FAsyncBatchLoadCompletedDelegate CompletedDelegate)
190{
191 static_assert(TIsDerivedFrom<TData, UPrimaryDataAsset>::Value, "TData must derive from UPrimaryDataAsset");
192
193 if (CompletedDelegate.IsBound() == false)
194 {
195 LOG_WARNING(LogCKAsset, "완료 델리게이트가 바인딩되지 않아, 로드된 에셋을 받을 수 없습니다.");
196 return;
197 }
198
199 UDataAssetManager& Instance = GetInstance();
200
201 const FPrimaryAssetType AssetType = GetDefault<TData>()->GetPrimaryAssetId().PrimaryAssetType;
202
203 TArray<FPrimaryAssetId> Ids;
204 Instance.GetPrimaryAssetIdList(AssetType, Ids);
205
206 TArray<FSoftObjectPath> PathsToLoad;
207
208 for (const FPrimaryAssetId& Id : Ids)
209 {
210 FAssetData AssetData;
211
212 if (Instance.GetPrimaryAssetData(Id, AssetData) == false)
213 {
214 continue;
215 }
216
217 if (AssetData.PackagePath.ToString().StartsWith(FolderPath) == false)
218 {
219 continue;
220 }
221
222 PathsToLoad.Add(AssetData.ToSoftObjectPath());
223 }
224
225 if (PathsToLoad.IsEmpty())
226 {
227 LOG_WARNING(LogCKAsset, "LoadAsyncByTypeAndPath: 경로 '%s'에서 로드할 에셋이 없습니다.", *FolderPath);
228
229 if (CompletedDelegate.IsBound())
230 {
231 CompletedDelegate.Execute({});
232 }
233
234 return;
235 }
236
237 auto LoadCompletedLambda = FStreamableDelegate::CreateLambda([PathsToLoad, CompletedDelegate]
238 {
239 TArray<UObject*> LoadedAssets;
240 LoadedAssets.Reserve(PathsToLoad.Num());
241
242 for (const FSoftObjectPath& Path : PathsToLoad)
243 {
244 UObject* ResolveObject = Path.ResolveObject();
245 ensureMsgf(ResolveObject, TEXT("'%s'에서 로드한 에셋이 Nullptr 입니다."), *Path.ToString());
246 LoadedAssets.Add(ResolveObject);
247 }
248
249 CompletedDelegate.Execute(LoadedAssets);
250 });
251
252 FStreamableManager& Manager = Instance.GetStreamableManager();
253 Manager.RequestAsyncLoad(PathsToLoad, LoadCompletedLambda);
254}
255
256#pragma endregion
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
DECLARE_DELEGATE_OneParam(FAsyncBatchLoadCompletedDelegate, const TArray< UObject * > &)
DECLARE_DELEGATE_TwoParams(FAsyncLoadCompletedDelegate, const FName &, UObject *)
Definition DataAssetBundle.h:19
Definition DataAssetManager.h:38
static void LoadAllPrimaryAssetsAsyncInPath(const FString &FolderPath, FAsyncBatchLoadCompletedDelegate CompletedDelegate=FAsyncBatchLoadCompletedDelegate())
지정한 폴더 경로에서 TData 타입의 에셋을 비동기로 일괄 로드합니다.
Definition DataAssetManager.h:189
UPrimaryDataAsset * LoadGameDataOfClass(TSubclassOf< UPrimaryDataAsset > DataClass, const TSoftObjectPtr< UPrimaryDataAsset > &DataClassPath, FPrimaryAssetType PrimaryAssetType)
지정한 클래스 타입의 게임 데이터 에셋을 동기 로드하고 GameDataMap에 등록합니다.
Definition DataAssetManager.cpp:164
static TData * GetAssetByType()
Definition DataAssetManager.h:103
TArray< const TData * > GetAllTypedGameData() const
const TData & GetOrLoadTypedGameData(const TSoftObjectPtr< TData > &DataPath)
static UDataAssetManager & GetInstance()
UDataAssetManager 싱글턴 인스턴스를 반환합니다.
Definition DataAssetManager.cpp:24
static TArray< TData * > GetAllAssetsByType()
Definition DataAssetManager.h:117
TMap< TObjectPtr< UClass >, FGameDataAssetList > GameDataMap
Definition DataAssetManager.h:89
Definition DataAssetJobManager.h:10
Definition DataAssetLoadJob.h:8
FString JobName
Definition DataAssetLoadJob.h:20
GameDataMap의 TMap Value 래퍼 구조체.
Definition DataAssetManager.h:25
TArray< TObjectPtr< UPrimaryDataAsset > > Assets
Definition DataAssetManager.h:30