Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
UDataAssetManager 클래스 참조

#include <DataAssetManager.h>

UDataAssetManager에 대한 상속 다이어그램 :
Inheritance graph
UDataAssetManager에 대한 협력 다이어그램:
Collaboration graph

Public 멤버 함수

 UDataAssetManager ()
 
virtual void StartInitialLoading () override
 
template<typename GameDataClass >
const GameDataClass & GetOrLoadTypedGameData (const TSoftObjectPtr< GameDataClass > &DataPath)
 
template<typename GameDataClass >
TArray< const GameDataClass * > GetAllTypedGameData () const
 

정적 Public 멤버 함수

static UDataAssetManagerGetInstance ()
 UDataAssetManager 싱글턴 인스턴스를 반환합니다.
 
template<typename TData >
static TData * GetAssetByType ()
 
template<typename TData >
static TArray< TData * > GetAllAssetsByType ()
 
template<typename TData >
static void LoadAllPrimaryAssetsAsyncInPath (const FString &FolderPath, FAsyncBatchLoadCompletedDelegate CompletedDelegate=FAsyncBatchLoadCompletedDelegate())
 지정한 폴더 경로에서 TData 타입의 에셋을 비동기로 일괄 로드합니다.
 
static void LoadAsyncByPath (const FSoftObjectPath &AssetPath, FAsyncLoadCompletedDelegate CompletedDelegate=FAsyncLoadCompletedDelegate())
 소프트 오브젝트 경로로 에셋을 비동기 로드합니다.
 
static void LoadAsyncByName (const FName &AssetName, FAsyncLoadCompletedDelegate CompletedDelegate=FAsyncLoadCompletedDelegate())
 Primary Asset 이름으로 에셋을 비동기 로드합니다.
 
static UObject * SynchronousLoadAsset (const FSoftObjectPath &AssetPath)
 소프트 오브젝트 경로로 에셋을 동기 로드합니다.
 

Protected 멤버 함수

template<typename TData >
const TData & GetOrLoadTypedGameData (const TSoftObjectPtr< TData > &DataPath)
 
template<typename TData >
TArray< const TData * > GetAllTypedGameData () const
 
void OnUpdateLoadPercentage (float Percentage)
 
virtual void TryCreateLoadJobForDataAsset (TSoftObjectPtr< UPrimaryDataAsset > DataPath, FString JobName)
 
UPrimaryDataAsset * LoadGameDataOfClass (TSubclassOf< UPrimaryDataAsset > DataClass, const TSoftObjectPtr< UPrimaryDataAsset > &DataClassPath, FPrimaryAssetType PrimaryAssetType)
 지정한 클래스 타입의 게임 데이터 에셋을 동기 로드하고 GameDataMap에 등록합니다.
 

Protected 속성

TSoftObjectPtr< IDataAssetBundleInitialBundlePath
 
TMap< TObjectPtr< UClass >, FGameDataAssetListGameDataMap
 
FDataAssetJobManager JobManager
 

Private 속성

TMap< FName, FSoftObjectPath > PrimaryAssetNameCache
 

생성자 & 소멸자 문서화

◆ UDataAssetManager()

UDataAssetManager::UDataAssetManager ( )
12{
13 InitialBundlePath = GetEnvironmentSoftPtrByKey<UPrimaryDataAsset>(TEXT("InitialBundle"));
14}
TSoftObjectPtr< IDataAssetBundle > InitialBundlePath
Definition DataAssetManager.h:86

멤버 함수 문서화

◆ GetAllAssetsByType()

template<typename TData >
TArray< TData * > UDataAssetManager::GetAllAssetsByType ( )
static

GameDataMap에서 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}
static UDataAssetManager & GetInstance()
UDataAssetManager 싱글턴 인스턴스를 반환합니다.
Definition DataAssetManager.cpp:24
TMap< TObjectPtr< UClass >, FGameDataAssetList > GameDataMap
Definition DataAssetManager.h:89
GameDataMap의 TMap Value 래퍼 구조체.
Definition DataAssetManager.h:25
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ GetAllTypedGameData() [1/2]

template<typename TData >
TArray< const TData * > UDataAssetManager::GetAllTypedGameData ( ) const
protected

◆ GetAllTypedGameData() [2/2]

template<typename GameDataClass >
TArray< 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}

◆ GetAssetByType()

template<typename TData >
TData * UDataAssetManager::GetAssetByType ( )
static

GameDataMap에서 TData 타입의 첫 번째 에셋을 반환합니다. 없으면 nullptr.

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}
TArray< TObjectPtr< UPrimaryDataAsset > > Assets
Definition DataAssetManager.h:30
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ GetInstance()

UDataAssetManager & UDataAssetManager::GetInstance ( )
static

UDataAssetManager 싱글턴 인스턴스를 반환합니다.

GEngine->AssetManager를 UDataAssetManager로 캐스팅하여 반환합니다. DefaultEngine.ini에 AssetManagerClassName이 올바르게 설정되어 있어야 합니다.

반환값
UDataAssetManager 싱글턴 참조
25{
26 checkf(GEngine, TEXT("GEngine 이 유효하지 않습니다. "));
27 UDataAssetManager* Singleton = Cast<UDataAssetManager>(GEngine->AssetManager);
28 checkf(Singleton, TEXT("%s가 에셋 매니저로 설정되어 있지 않습니다."), NAMEOF(UDataAssetManager));
29 return *Singleton;
30}
#define NAMEOF(Type)
Definition CK_UE.h:30
Definition DataAssetManager.h:38
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetOrLoadTypedGameData() [1/2]

template<typename GameDataClass >
const 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}
UPrimaryDataAsset * LoadGameDataOfClass(TSubclassOf< UPrimaryDataAsset > DataClass, const TSoftObjectPtr< UPrimaryDataAsset > &DataClassPath, FPrimaryAssetType PrimaryAssetType)
지정한 클래스 타입의 게임 데이터 에셋을 동기 로드하고 GameDataMap에 등록합니다.
Definition DataAssetManager.cpp:164
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ GetOrLoadTypedGameData() [2/2]

template<typename TData >
const TData & UDataAssetManager::GetOrLoadTypedGameData ( const TSoftObjectPtr< TData > &  DataPath)
protected

◆ LoadAllPrimaryAssetsAsyncInPath()

template<typename TData >
void UDataAssetManager::LoadAllPrimaryAssetsAsyncInPath ( const FString &  FolderPath,
FAsyncBatchLoadCompletedDelegate  CompletedDelegate = FAsyncBatchLoadCompletedDelegate() 
)
static

지정한 폴더 경로에서 TData 타입의 에셋을 비동기로 일괄 로드합니다.

TData::StaticClass()->GetFName()을 PrimaryAssetType으로 사용하여 등록된 ID를 수집하고, FolderPath로 시작하는 PackagePath를 가진 에셋만 필터링합니다. 로드할 에셋이 없으면 빈 배열로 즉시 콜백합니다.

매개변수
FolderPath필터링할 패키지 경로 (예: "/Game/CK_UE/Core/Data/LevelData")
CompletedDelegate로드 완료 시 호출될 델리게이트 (로드된 UObject 배열 전달)
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}
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ LoadAsyncByName()

void UDataAssetManager::LoadAsyncByName ( const FName &  AssetName,
FAsyncLoadCompletedDelegate  CompletedDelegate = FAsyncLoadCompletedDelegate() 
)
static

Primary Asset 이름으로 에셋을 비동기 로드합니다.

Asset Manager에 등록된 모든 Primary Asset 중 이름이 일치하는 항목을 탐색한 뒤 LoadAsyncByPath에 위임합니다. 동일한 이름이 여러 타입에 등록된 경우 첫 번째 매칭만 로드됩니다.

매개변수
AssetName로드할 에셋의 PrimaryAssetName
CompletedDelegate로드 완료 시 호출될 델리게이트 (에셋 이름, 로드된 UObject 전달)
77{
78 const FSoftObjectPath* Found = GetInstance().PrimaryAssetNameCache.Find(AssetName);
79
80 if (Found == nullptr)
81 {
82 LOG_WARNING(LogCKAsset, "LoadAsyncByName: '%s' 이름의 Primary Asset을 찾을 수 없습니다.", *AssetName.ToString());
83 }
84 else
85 {
86 LoadAsyncByPath(*Found, CompletedDelegate);
87 }
88}
static void LoadAsyncByPath(const FSoftObjectPath &AssetPath, FAsyncLoadCompletedDelegate CompletedDelegate=FAsyncLoadCompletedDelegate())
소프트 오브젝트 경로로 에셋을 비동기 로드합니다.
Definition DataAssetManager.cpp:42
TMap< FName, FSoftObjectPath > PrimaryAssetNameCache
Definition DataAssetManager.h:96
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ LoadAsyncByPath()

void UDataAssetManager::LoadAsyncByPath ( const FSoftObjectPath &  AssetPath,
FAsyncLoadCompletedDelegate  CompletedDelegate = FAsyncLoadCompletedDelegate() 
)
static

소프트 오브젝트 경로로 에셋을 비동기 로드합니다.

FStreamableManager::RequestAsyncLoad를 사용하여 메인 스레드를 블로킹하지 않습니다. 로드 완료 시 CompletedDelegate가 게임 스레드에서 호출됩니다.

매개변수
AssetPath로드할 에셋의 소프트 오브젝트 경로
CompletedDelegate로드 완료 시 호출될 델리게이트 (에셋 이름, 로드된 UObject 전달)
43{
44 if (AssetPath.IsValid() == false)
45 {
46 LOG_WARNING(LogCKAsset, "LoadAsyncByPath 가 유효하지 않은 에셋 경로입니다.");
47 return;
48 }
49
50 FStreamableManager& Manager = GetInstance().GetStreamableManager();
51
52 auto LoadCompletedLambda = FStreamableDelegate::CreateLambda([AssetPath, CompletedDelegate]()
53 {
54 if (CompletedDelegate.IsBound() == false)
55 {
56 return;
57 }
58
59 CompletedDelegate.Execute(AssetPath.GetAssetFName(), AssetPath.ResolveObject());
60 });
61
62 Manager.RequestAsyncLoad(AssetPath, LoadCompletedLambda);
63}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ LoadGameDataOfClass()

UPrimaryDataAsset * UDataAssetManager::LoadGameDataOfClass ( TSubclassOf< UPrimaryDataAsset >  DataClass,
const TSoftObjectPtr< UPrimaryDataAsset > &  DataClassPath,
FPrimaryAssetType  PrimaryAssetType 
)
protected

지정한 클래스 타입의 게임 데이터 에셋을 동기 로드하고 GameDataMap에 등록합니다.

에디터 환경에서는 LoadSynchronous()를 사용하고, 런타임에서는 LoadPrimaryAssetsWithType()으로 스트리밍 후 WaitUntilComplete()로 대기합니다.

매개변수
DataClass로드할 게임 데이터의 UClass
DataClassPath로드할 에셋의 소프트 오브젝트 포인터
PrimaryAssetTypeAsset Manager에 등록된 Primary Asset 타입
반환값
로드된 UPrimaryDataAsset 포인터. 실패 시 nullptr
165{
166 UPrimaryDataAsset* Asset = nullptr;
167 DECLARE_SCOPE_CYCLE_COUNTER(TEXT("Loading GameData Object"), STAT_GameData, STATGROUP_LoadTime);
168
169 if (DataClassPath.IsNull())
170 {
171 return Asset;
172 }
173
174#if WITH_EDITOR
175 FText Message = FText::Format(NSLOCTEXT("PlaybackEditor", "BeginLoadingGameDataTask", "Loading GameData {0}"), FText::FromName(DataClass->GetFName()));
176 FScopedSlowTask SlowTask(0, Message);
177 SlowTask.MakeDialog(false, true);
178#endif
179
180 LOG_INFO(LogCKAsset, "게임 데이터 로드 중: %s ...", *DataClassPath.ToString());
181 SCOPE_LOG_TIME_IN_SECONDS(TEXT(" ... GameData loaded!"), nullptr);
182
183 TSharedPtr<FStreamableHandle> Handle = LoadPrimaryAssetsWithType(PrimaryAssetType);
184
185 if (Handle.IsValid())
186 {
187 Handle->WaitUntilComplete(0.0f, false);
188 Asset = Cast<UPrimaryDataAsset>(Handle->GetLoadedAsset());
189 }
190
191 // Handle이 null인 경우(에디터에서 이미 로드된 에셋 등) Get() 으로 폴백
192 if (Asset == nullptr)
193 {
194 Asset = DataClassPath.Get();
195 }
196
197 if (Asset)
198 {
199 GameDataMap.FindOrAdd(DataClass).Assets.Add(Asset);
200 }
201
202 return Asset;
203}
#define LOG_INFO(Category, Format,...)
Definition CK_UE.h:38
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnUpdateLoadPercentage()

void UDataAssetManager::OnUpdateLoadPercentage ( float  Percentage)
protected
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ StartInitialLoading()

void UDataAssetManager::StartInitialLoading ( )
overridevirtual
207{
208 Super::StartInitialLoading();
209
210 LOG_INFO(LogCKAsset, "기본 Primary 데이터 로드를 시작합니다. ");
211
212 TArray<FPrimaryAssetId> AllIds;
213 GetPrimaryAssetIdList(FPrimaryAssetType(), AllIds);
214 PrimaryAssetNameCache.Reserve(AllIds.Num());
215
216
217 Algo::ForEach(AllIds, [this](const FPrimaryAssetId& Id)
218 {
219 LOG_INFO(LogCKAsset, "%s 에셋을 등록합니다. ", *Id.PrimaryAssetName.ToString());
220
221 //AllIds는 유효한 ID만 담고 있으므로 GetPrimaryAssetPath이 실패할 일이 없음.
222 PrimaryAssetNameCache.Add(Id.PrimaryAssetName, GetPrimaryAssetPath(Id));
223 });
224
225
226 if (InitialBundlePath.IsNull())
227 {
228 return;
229 }
230
231 LOG_INFO(LogCKAsset, "데이터 로드를 시작합니다. ");
232
233
234 TryCreateLoadJobForDataAsset(InitialBundlePath, TEXT("LoadGameData"));
235
236 DataAssetLoadJobProgress Progress;
237 Progress.BindUObject(this, &UDataAssetManager::OnUpdateLoadPercentage);
238
239 if (Progress.IsBound() == false)
240 {
241 LOG_ERROR(LogCKAsset, "OnUpdateLoadPercentage 함수 등록에 실패했습니다.");
242 return;
243 }
244
245 JobManager.RunAllJobs(Progress, [this](const float ElapsedTime)
246 {
247 LOG_INFO(LogCKAsset, "모든 시작 작업이 %.2f초 만에 완료되었습니다", ElapsedTime);
248 });
249}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
virtual void TryCreateLoadJobForDataAsset(TSoftObjectPtr< UPrimaryDataAsset > DataPath, FString JobName)
Definition DataAssetManager.cpp:121
FDataAssetJobManager JobManager
Definition DataAssetManager.h:92
void OnUpdateLoadPercentage(float Percentage)
void RunAllJobs(const DataAssetLoadJobProgress &Progress=nullptr)
Definition DataAssetJobManager.cpp:11
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SynchronousLoadAsset()

UObject * UDataAssetManager::SynchronousLoadAsset ( const FSoftObjectPath &  AssetPath)
static

소프트 오브젝트 경로로 에셋을 동기 로드합니다.

Asset Manager가 초기화된 경우 StreamableManager를 통해 로드하고, 그렇지 않은 경우 TryLoad()로 폴백합니다.

매개변수
AssetPath로드할 에셋의 소프트 오브젝트 경로
반환값
로드된 UObject 포인터. 경로가 유효하지 않으면 nullptr
101{
102 if (AssetPath.IsValid() == false)
103 {
104 return nullptr;
105 }
106
107 if (IsInitialized())
108 {
109 return GetStreamableManager().LoadSynchronous(AssetPath, false);
110 }
111 else
112 {
113 return AssetPath.TryLoad();
114 }
115}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TryCreateLoadJobForDataAsset()

void UDataAssetManager::TryCreateLoadJobForDataAsset ( TSoftObjectPtr< UPrimaryDataAsset >  DataPath,
FString  JobName 
)
protectedvirtual
122{
123 if (DataPath.IsNull() || JobName.IsEmpty())
124 {
125 LOG_ERROR(LogCKAsset, "유효하지 않은 데이터 경로 또는 이미 로드된 데이터입니다: %s", *DataPath.ToString());
126 return;
127 }
128
129 auto LoadJobLambda = [this, DataPath](const auto _, const auto __)
130 {
131 UObject* Loaded = SynchronousLoadAsset(DataPath.ToSoftObjectPath());
132 UPrimaryDataAsset* Asset = Cast<UPrimaryDataAsset>(Loaded);
133
134 if (Asset == nullptr)
135 {
136 LOG_ERROR(LogCKAsset, "초기화 데이터 에셋 로드 실패: %s", *DataPath.ToString());
137 return;
138 }
139
140 if (Asset->Implements<UDataAssetBundle>() == false)
141 {
142 LOG_WARNING(LogCKAsset, "IDataAssetBundle을 구현하지 않은 에셋은 로드할 수 없습니다: %s", *DataPath.ToString());
143 return;
144 }
145
146 GameDataMap.FindOrAdd(Asset->GetClass()).Assets.Add(Asset);
147 };
148
149 JobManager.CreateAndAddNewJob(JobName, 25.0f, LoadJobLambda);
150}
Definition DataAssetBundle.h:13
static UObject * SynchronousLoadAsset(const FSoftObjectPath &AssetPath)
소프트 오브젝트 경로로 에셋을 동기 로드합니다.
Definition DataAssetManager.cpp:100
void CreateAndAddNewJob(const ::FString &InJobName, float InJobWeight, const TFunction< void(const FDataAssetLoadJob &, TSharedPtr< FStreamableHandle > &)> &InJobFunc)
Definition DataAssetJobManager.cpp:17
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ GameDataMap

TMap<TObjectPtr<UClass>, FGameDataAssetList> UDataAssetManager::GameDataMap
protected

◆ InitialBundlePath

TSoftObjectPtr<IDataAssetBundle> UDataAssetManager::InitialBundlePath
protected

◆ JobManager

FDataAssetJobManager UDataAssetManager::JobManager
protected

◆ PrimaryAssetNameCache

TMap<FName, FSoftObjectPath> UDataAssetManager::PrimaryAssetNameCache
private

StartInitialLoading에서 구축되는 이름 → 경로 캐시. LoadAsyncByName O(1) 조회에 사용됩니다.


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: