3#include "CoreMinimal.h"
5#include "Engine/AssetManager.h"
7#include "DataAssetManager.generated.h"
30 TArray<TObjectPtr<UPrimaryDataAsset>> Assets;
48 template <
typename TData>
49 static TData* GetAssetByType();
52 template <
typename TData>
53 static TArray<TData*> GetAllAssetsByType();
55 template <
typename TData>
56 static void LoadAllPrimaryAssetsAsyncInPath(
const FString& FolderPath, FAsyncBatchLoadCompletedDelegate CompletedDelegate = FAsyncBatchLoadCompletedDelegate());
58 static void LoadAsyncByPath(
const FSoftObjectPath& AssetPath, FAsyncLoadCompletedDelegate CompletedDelegate = FAsyncLoadCompletedDelegate());
59 static void LoadAsyncByName(
const FName& AssetName, FAsyncLoadCompletedDelegate CompletedDelegate = FAsyncLoadCompletedDelegate());
61 static UObject* SynchronousLoadAsset(
const FSoftObjectPath& AssetPath);
65 virtual void StartInitialLoading()
override;
69 template <
typename TData>
72 template <
typename TData>
77 UFUNCTION(BlueprintNativeEvent, Category =
"DataAssetManager")
78 void OnUpdateLoadPercentage(
float Percentage);
80 virtual
void TryCreateLoadJobForDataAsset(TSoftObjectPtr<UPrimaryDataAsset> DataPath, FString
JobName);
81 UPrimaryDataAsset* LoadGameDataOfClass(TSubclassOf<UPrimaryDataAsset> DataClass, const TSoftObjectPtr<UPrimaryDataAsset>& DataClassPath, FPrimaryAssetType PrimaryAssetType);
85 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = GameData)
96 TMap<FName, FSoftObjectPath> PrimaryAssetNameCache;
100#pragma region Static Template Functions
102template <
typename TData>
107 if (List ==
nullptr || List->
Assets.IsEmpty())
112 return Cast<TData>(List->
Assets[0]);
116template <
typename TData>
119 TArray<TData*> Result;
128 for (
const TObjectPtr<UPrimaryDataAsset>& Asset : List->
Assets)
130 if (TData* Typed = Cast<TData>(Asset))
140template <
typename GameDataClass>
143 if (
auto* pResult =
GameDataMap.Find(GameDataClass::StaticClass()))
145 if (pResult->Assets.IsEmpty() ==
false)
147 return *CastChecked<GameDataClass>(pResult->Assets[0]);
151 return *CastChecked<const GameDataClass>(
LoadGameDataOfClass(GameDataClass::StaticClass(), DataPath, GameDataClass::StaticClass()->GetFName()));
155template <
typename GameDataClass>
158 TArray<const GameDataClass*> Result;
160 const auto* pResult =
GameDataMap.Find(GameDataClass::StaticClass());
162 if (pResult ==
nullptr)
167 for (
const TObjectPtr<UPrimaryDataAsset>& Asset : pResult->Assets)
169 if (
const GameDataClass* Typed = Cast<GameDataClass>(Asset))
188template <
typename TData>
191 static_assert(TIsDerivedFrom<TData, UPrimaryDataAsset>::Value,
"TData must derive from UPrimaryDataAsset");
193 if (CompletedDelegate.IsBound() ==
false)
195 LOG_WARNING(LogCKAsset,
"완료 델리게이트가 바인딩되지 않아, 로드된 에셋을 받을 수 없습니다.");
201 const FPrimaryAssetType AssetType = GetDefault<TData>()->GetPrimaryAssetId().PrimaryAssetType;
203 TArray<FPrimaryAssetId> Ids;
204 Instance.GetPrimaryAssetIdList(AssetType, Ids);
206 TArray<FSoftObjectPath> PathsToLoad;
208 for (
const FPrimaryAssetId& Id : Ids)
210 FAssetData AssetData;
212 if (Instance.GetPrimaryAssetData(Id, AssetData) ==
false)
217 if (AssetData.PackagePath.ToString().StartsWith(FolderPath) ==
false)
222 PathsToLoad.Add(AssetData.ToSoftObjectPath());
225 if (PathsToLoad.IsEmpty())
227 LOG_WARNING(LogCKAsset,
"LoadAsyncByTypeAndPath: 경로 '%s'에서 로드할 에셋이 없습니다.", *FolderPath);
229 if (CompletedDelegate.IsBound())
231 CompletedDelegate.Execute({});
237 auto LoadCompletedLambda = FStreamableDelegate::CreateLambda([PathsToLoad, CompletedDelegate]
239 TArray<UObject*> LoadedAssets;
240 LoadedAssets.Reserve(PathsToLoad.Num());
242 for (
const FSoftObjectPath& Path : PathsToLoad)
244 UObject* ResolveObject = Path.ResolveObject();
245 ensureMsgf(ResolveObject, TEXT(
"'%s'에서 로드한 에셋이 Nullptr 입니다."), *Path.ToString());
246 LoadedAssets.Add(ResolveObject);
249 CompletedDelegate.Execute(LoadedAssets);
252 FStreamableManager& Manager = Instance.GetStreamableManager();
253 Manager.RequestAsyncLoad(PathsToLoad, LoadCompletedLambda);
#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