DataBundle의 로드/언로드를 관리하는 GameInstance 서브시스템.
더 자세히 ...
#include <DataBundleRegistry.h>
|
| virtual void | Initialize (FSubsystemCollectionBase &Collection) override |
| | 서브시스템 초기화. 번들 스캔 및 PreLoad 정책 번들 로드를 수행합니다.
|
| |
| virtual void | Deinitialize () override |
| | 서브시스템 종료. 모든 StreamableHandle을 해제하고 상태를 정리합니다.
|
| |
| void | RequestLoad (FGameplayTag BundleTag, TFunction< void(UDataBundleDefinition *)> OnReady=nullptr) |
| | 번들을 비동기 로드합니다. 로드 완료 시 OnReady 콜백을 호출합니다.
|
| |
| void | RequestLoad (const FGameplayTagContainer &BundleTags, TFunction< void(TArray< UDataBundleDefinition * >)> OnAllReady) |
| | 여러 번들을 비동기 로드합니다. 모든 번들 로드 완료 시 OnAllReady 콜백을 호출합니다.
|
| |
| void | Release (FGameplayTag BundleTag) |
| | 번들을 언로드합니다 (bPersistent 번들 제외).
|
| |
| void | ForceRelease (FGameplayTag BundleTag) |
| | bPersistent 여부와 관계없이 번들을 강제 언로드합니다.
|
| |
| EDataBundleState | GetState (FGameplayTag BundleTag) const |
| | 번들의 현재 로드 상태를 반환합니다.
|
| |
| bool | IsLoaded (FGameplayTag BundleTag) const |
| | 번들이 로드 완료 상태인지 여부를 반환합니다.
|
| |
| TArray< FGameplayTag > | GetLoadedBundleTags () const |
| | 현재 로드 완료 상태인 모든 번들의 태그 목록을 반환합니다.
|
| |
| void | ReleaseUnusedBundles (const FGameplayTagContainer &RequiredTags) |
| | 로드된 번들 중 RequiredTags에 없는 번들을 해제합니다.
|
| |
| template<typename T > |
| T * | GetBundleAsset (FGameplayTag BundleTag, const TSoftObjectPtr< T > &AssetPtr) const |
| | 로드된 번들에서 특정 에셋을 동기적으로 반환합니다.
|
| |
| template<typename T > |
| void | RequestBundleAsset (FGameplayTag BundleTag, const TSoftObjectPtr< T > &AssetPtr, TFunction< void(T *)> OnReady) |
| | 번들을 비동기 로드한 뒤 에셋 포인터를 콜백으로 전달합니다.
|
| |
DataBundle의 로드/언로드를 관리하는 GameInstance 서브시스템.
특징:
- 이미 로드된 번들에 RequestLoad 시 콜백만 즉시 실행 (중복 로드 없음)
- 로딩 중 중복 요청: 콜백만 큐에 추가, 로드 완료 시 일괄 실행
- 로드할 번들은 ULevelStreamingData::UsingBundlesTag로 지정
DefaultGame.ini에 DataBundle PrimaryAssetType 등록 필요 (DataBundleDefinition.h 참조)
◆ Deinitialize()
| void UDataBundleRegistry::Deinitialize |
( |
| ) |
|
|
overridevirtual |
서브시스템 종료. 모든 StreamableHandle을 해제하고 상태를 정리합니다.
30{
31
32 for (
auto& [Tag, Entry] :
Entries)
33 {
34 if (Entry.Handle.IsValid())
35 {
36 Entry.Handle->ReleaseHandle();
37 }
38 }
39
43
44 Super::Deinitialize();
45}
static UDataBundleRegistry * Instance
싱글톤 인스턴스.
Definition DataBundleRegistry.h:241
TMap< FGameplayTag, FBundleEntry > Entries
번들 태그 → 런타임 상태 맵.
Definition DataBundleRegistry.h:238
TMap< FGameplayTag, TObjectPtr< UDataBundleDefinition > > Definitions
번들 태그 → 정의 에셋 맵. UPROPERTY로 GC를 방지합니다.
Definition DataBundleRegistry.h:235
◆ FindBundleAssetsByTag()
주어진 태그와 매칭되는 번들 정의 목록을 반환합니다.
FGameplayTag::MatchesTag 기준으로 비교하므로 부모 태그를 전달하면 하위 태그를 가진 번들들이 모두 포함됩니다. (예: "Bundle.Level" 전달 시 "Bundle.Level.Forest" 번들도 반환)
- 매개변수
-
| BundleTag | 필터링 기준이 될 GameplayTag. |
- 반환값
- 매칭되는 UDataBundleDefinition 배열.
434{
435 TArray<UDataBundleDefinition*> Result;
436
438 {
439 return Result;
440 }
441
443 {
444 if (Tag.MatchesTag(BundleTag))
445 {
446 Result.Add(Def);
447 }
448 }
449
450 return Result;
451}
◆ FlushPendingCallbacks()
| void UDataBundleRegistry::FlushPendingCallbacks |
( |
FGameplayTag |
BundleTag | ) |
|
|
private |
누적된 PendingCallbacks를 모두 실행하고 큐를 비웁니다.
- 매개변수
-
| BundleTag | 콜백을 실행할 번들의 GameplayTag. |
275{
276 FBundleEntry* Entry =
Entries.Find(BundleTag);
277
278 if (Entry == nullptr)
279 {
280 return;
281 }
282
284
285
287
288 for (auto& CallbackFunc : Callbacks)
289 {
290 if (CallbackFunc)
291 {
292 CallbackFunc(Def);
293 }
294 }
295}
Definition DataBundleDefinition.h:29
◆ ForceRelease()
| void UDataBundleRegistry::ForceRelease |
( |
FGameplayTag |
BundleTag | ) |
|
bPersistent 여부와 관계없이 번들을 강제 언로드합니다.
- 매개변수
-
| BundleTag | 해제할 번들의 GameplayTag. |
331{
332 FBundleEntry* Entry =
Entries.Find(BundleTag);
333
334 if (Entry == nullptr || Entry->State != EDataBundleState::Loaded)
335 {
336 return;
337 }
338
339 if (Entry->Handle.IsValid())
340 {
341 TArray<UObject*> LoadedObjects;
342 Entry->Handle->GetLoadedAssets(LoadedObjects);
344
345 Entry->Handle->ReleaseHandle();
346 Entry->Handle.Reset();
347 }
348
349 Entry->State = EDataBundleState::Unloaded;
350
351 LOG_SCREEN(
"번들 강제 언로드: %s", *BundleTag.ToString());
352}
#define LOG_SCREEN(Format,...)
Definition CK_UE.h:50
void NotifyBundleReleasedToAssets(const TArray< UObject * > &Assets, FGameplayTag BundleTag)
Definition DataBundleRegistry.cpp:466
◆ Get()
싱글톤 인스턴스를 반환합니다. 서브시스템이 초기화되지 않은 경우 nullptr을 반환합니다.
◆ GetBundleAsset()
template<typename T >
| T * UDataBundleRegistry::GetBundleAsset |
( |
FGameplayTag |
BundleTag, |
|
|
const TSoftObjectPtr< T > & |
AssetPtr |
|
) |
| const |
로드된 번들에서 특정 에셋을 동기적으로 반환합니다.
번들이 로드되지 않은 경우 nullptr을 반환합니다. 비동기 접근이 필요하면 RequestBundleAsset을 사용하세요.
- 템플릿 파라메터
-
- 매개변수
-
| BundleTag | 조회할 번들 태그. |
| AssetPtr | 반환할 에셋의 소프트 포인터. |
- 반환값
- 번들이 로드 상태면 T*, 아니면 nullptr.
249{
251 {
252 LOG_WARNING(LogCKAsset,
"번들 '%s'이 로드되지 않은 상태에서 GetBundleAsset 호출됨.", *BundleTag.ToString());
253 return nullptr;
254 }
255
256 T* Asset = AssetPtr.Get();
257
258 if (Asset == nullptr)
259 {
260 LOG_WARNING(LogCKAsset,
"번들 '%s'의 에셋 '%s'이 메모리에 없습니다.", *BundleTag.ToString(), *AssetPtr.ToString());
261 }
262
263 return Asset;
264}
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
bool IsLoaded(FGameplayTag BundleTag) const
번들이 로드 완료 상태인지 여부를 반환합니다.
Definition DataBundleRegistry.cpp:368
◆ GetBundleAssetByTag()
template<typename T >
| T * UDataBundleRegistry::GetBundleAssetByTag |
( |
FGameplayTag |
BundleTag | ) |
|
|
static |
293{
295 {
296 TArray<T*> Found = UDataBundleRegistry::GetBundleAssetsOfType<T>(BundleDef);
297
298 if (Found.IsEmpty())
299 {
300 continue;
301 }
302
303 return Found[0];
304 }
305
306 return nullptr;
307}
static TArray< UDataBundleDefinition * > FindBundleAssetsByTag(FGameplayTag BundleTag)
주어진 태그와 매칭되는 번들 정의 목록을 반환합니다.
Definition DataBundleRegistry.cpp:433
◆ GetBundleAssetsOfType()
번들 정의에 포함된 에셋 중 특정 타입에 해당하는 목록을 반환합니다.
번들이 로드된 상태에서 전달받은 정의 에셋의 Assets를 순회하며 T* 로 캐스팅 가능한 것만 반환합니다. 에셋이 메모리에 없으면 해당 항목은 건너뜁니다.
- 템플릿 파라메터
-
- 매개변수
-
- 반환값
- T* 타입으로 캐스팅 가능한 에셋 배열.
269{
270 TArray<T*> Result;
271
272 if (BundleDef == nullptr)
273 {
274 return Result;
275 }
276
277 for (const TSoftObjectPtr<IDataAssetBundle>& SoftAsset : BundleDef->Assets)
278 {
279 UObject* Obj = SoftAsset.ToSoftObjectPath().ResolveObject();
280
281 if (T* TypedAsset = Cast<T>(Obj))
282 {
283 Result.Add(TypedAsset);
284 }
285 }
286
287 return Result;
288}
◆ GetLoadedBundleTags()
| TArray< FGameplayTag > UDataBundleRegistry::GetLoadedBundleTags |
( |
| ) |
const |
현재 로드 완료 상태인 모든 번들의 태그 목록을 반환합니다.
- 반환값
- Loaded 상태인 번들 태그 배열.
382{
383 TArray<FGameplayTag> Result;
384
385 for (
const auto& [Tag, Entry] :
Entries)
386 {
387 if (Entry.State == EDataBundleState::Loaded)
388 {
389 Result.Add(Tag);
390 }
391 }
392
393 return Result;
394}
◆ GetState()
번들의 현재 로드 상태를 반환합니다.
- 매개변수
-
| BundleTag | 조회할 번들의 GameplayTag. |
- 반환값
- 해당 번들의 EDataBundleState. 등록되지 않은 경우 Unloaded 반환.
356{
357 if (
const FBundleEntry* Entry =
Entries.Find(BundleTag))
358 {
359 return Entry->State;
360 }
361 else
362 {
363 return EDataBundleState::Unloaded;
364 }
365}
◆ Initialize()
| void UDataBundleRegistry::Initialize |
( |
FSubsystemCollectionBase & |
Collection | ) |
|
|
overridevirtual |
서브시스템 초기화. 번들 스캔 및 PreLoad 정책 번들 로드를 수행합니다.
21{
22 Super::Initialize(Collection);
26}
void PreLoadBundles()
LoadPolicy가 PreLoad인 번들을 게임 시작 시 자동 로드합니다.
Definition DataBundleRegistry.cpp:94
void ScanAndRegisterBundles()
AssetManager에서 DataBundle 타입 에셋을 스캔해 Definitions에 등록합니다.
Definition DataBundleRegistry.cpp:48
◆ IsLoaded()
| bool UDataBundleRegistry::IsLoaded |
( |
FGameplayTag |
BundleTag | ) |
const |
번들이 로드 완료 상태인지 여부를 반환합니다.
- 매개변수
-
| BundleTag | 조회할 번들의 GameplayTag. |
- 반환값
- 로드 완료 상태이면 true.
369{
370 if (
GetState(BundleTag) == EDataBundleState::Loaded)
371 {
372 return true;
373 }
374 else
375 {
376 return false;
377 }
378}
EDataBundleState GetState(FGameplayTag BundleTag) const
번들의 현재 로드 상태를 반환합니다.
Definition DataBundleRegistry.cpp:355
◆ NotifyBundleLoadedToAssets()
| void UDataBundleRegistry::NotifyBundleLoadedToAssets |
( |
const TArray< UObject * > & |
Assets, |
|
|
FGameplayTag |
BundleTag |
|
) |
| |
|
private |
455{
456 for (UObject* Asset : Assets)
457 {
459 {
460 IDataAssetBundle::Execute_OnBundleLoaded(Asset, BundleTag);
461 }
462 }
463}
Definition DataAssetBundle.h:13
◆ NotifyBundleReleasedToAssets()
| void UDataBundleRegistry::NotifyBundleReleasedToAssets |
( |
const TArray< UObject * > & |
Assets, |
|
|
FGameplayTag |
BundleTag |
|
) |
| |
|
private |
467{
468 for (UObject* Asset : Assets)
469 {
471 {
472 IDataAssetBundle::Execute_OnBundleReleased(Asset, BundleTag);
473 }
474 }
475}
◆ OnAllDependenciesReady()
| void UDataBundleRegistry::OnAllDependenciesReady |
( |
FGameplayTag |
BundleTag | ) |
|
|
private |
의존 번들이 모두 로드됐을 때 호출됩니다. 본 번들의 에셋 스트리밍을 시작합니다.
- 매개변수
-
| BundleTag | 에셋 스트리밍을 시작할 번들의 GameplayTag. |
216{
218
219 if (Def == nullptr)
220 {
221 return;
222 }
223
225
226
227 if (AssetPaths.IsEmpty())
228 {
230 return;
231 }
232
233 FStreamableManager& Manager = UAssetManager::Get().GetStreamableManager();
234
235 auto AssetsLoadedLambda = FStreamableDelegate::CreateWeakLambda(this, [this, BundleTag]()
236 {
238 });
239
240 TSharedPtr<FStreamableHandle> Handle = Manager.RequestAsyncLoad(AssetPaths, AssetsLoadedLambda);
241
242
243 if (FBundleEntry* Entry =
Entries.Find(BundleTag))
244 {
245 Entry->Handle = Handle;
246 }
247}
TArray< FSoftObjectPath > GetAssetPaths() const
Definition DataBundleDefinition.cpp:14
void OnAssetsLoaded(FGameplayTag BundleTag)
에셋 스트리밍 완료 시 호출됩니다. 상태를 Loaded로 전환하고 콜백을 실행합니다.
Definition DataBundleRegistry.cpp:250
◆ OnAssetsLoaded()
| void UDataBundleRegistry::OnAssetsLoaded |
( |
FGameplayTag |
BundleTag | ) |
|
|
private |
에셋 스트리밍 완료 시 호출됩니다. 상태를 Loaded로 전환하고 콜백을 실행합니다.
로드 완료 전 이미 Release된 경우 bPersistent 여부에 따라 즉시 언로드합니다.
- 매개변수
-
| BundleTag | 로드가 완료된 번들의 GameplayTag. |
251{
252 FBundleEntry* Entry =
Entries.Find(BundleTag);
253
254 if (Entry == nullptr)
255 {
256 return;
257 }
258
259 Entry->State = EDataBundleState::Loaded;
260
261 LOG_SCREEN(
"번들 로드 완료: %s", *BundleTag.ToString());
262
263 if (Entry->Handle.IsValid())
264 {
265 TArray<UObject*> LoadedObjects;
266 Entry->Handle->GetLoadedAssets(LoadedObjects);
268 }
269
271}
void FlushPendingCallbacks(FGameplayTag BundleTag)
누적된 PendingCallbacks를 모두 실행하고 큐를 비웁니다.
Definition DataBundleRegistry.cpp:274
void NotifyBundleLoadedToAssets(const TArray< UObject * > &Assets, FGameplayTag BundleTag)
Definition DataBundleRegistry.cpp:454
◆ PreLoadBundles()
| void UDataBundleRegistry::PreLoadBundles |
( |
| ) |
|
|
private |
LoadPolicy가 PreLoad인 번들을 게임 시작 시 자동 로드합니다.
95{
96 int32 PreLoadCount = 0;
97
99 {
100 if (Def == nullptr)
101 {
102 continue;
103 }
104
105
106 if (Def->LoadPolicy != EBundleLoadPolicy::PreLoad)
107 {
108 continue;
109 }
110
112 PreLoadCount++;
113
114 LOG_INFO(LogCKAsset,
"번들 PreLoad 요청: %s", *Tag.ToString());
115 }
116
117 LOG_INFO(LogCKAsset,
"PreLoad 정책 번들 %d개 로드 요청 완료", PreLoadCount);
118}
#define LOG_INFO(Category, Format,...)
Definition CK_UE.h:38
void RequestLoad(FGameplayTag BundleTag, TFunction< void(UDataBundleDefinition *)> OnReady=nullptr)
번들을 비동기 로드합니다. 로드 완료 시 OnReady 콜백을 호출합니다.
Definition DataBundleRegistry.cpp:162
◆ Release()
| void UDataBundleRegistry::Release |
( |
FGameplayTag |
BundleTag | ) |
|
번들을 언로드합니다 (bPersistent 번들 제외).
- 매개변수
-
| BundleTag | 해제할 번들의 GameplayTag. |
299{
300 FBundleEntry* Entry =
Entries.Find(BundleTag);
301
302 if (Entry == nullptr || Entry->State != EDataBundleState::Loaded)
303 {
304 return;
305 }
306
308
310 {
311 return;
312 }
313
314 if (Entry->Handle.IsValid())
315 {
316 TArray<UObject*> LoadedObjects;
317 Entry->Handle->GetLoadedAssets(LoadedObjects);
319
320 Entry->Handle->ReleaseHandle();
321 Entry->Handle.Reset();
322 }
323
324 Entry->State = EDataBundleState::Unloaded;
325
326 LOG_SCREEN(
"번들 언로드: %s", *BundleTag.ToString());
327}
bool bPersistent
Definition DataBundleDefinition.h:43
◆ ReleaseUnusedBundles()
| void UDataBundleRegistry::ReleaseUnusedBundles |
( |
const FGameplayTagContainer & |
RequiredTags | ) |
|
로드된 번들 중 RequiredTags에 없는 번들을 해제합니다.
bPersistent 번들은 건너뜁니다.
- 매개변수
-
| RequiredTags | 유지할 번들 태그 목록. |
398{
399
400 TArray<FGameplayTag> TagsToRelease;
401
402 for (
const auto& [Tag, Entry] :
Entries)
403 {
404 if (Entry.State != EDataBundleState::Loaded)
405 {
406 continue;
407 }
408
409 if (RequiredTags.HasTagExact(Tag))
410 {
411 continue;
412 }
413
415
417 {
418 continue;
419 }
420
421 TagsToRelease.Add(Tag);
422 }
423
424 LOG_INFO(LogCKAsset,
"[ReleaseUnused] 해제 대상: %d개", TagsToRelease.Num());
425
426 for (const FGameplayTag& Tag : TagsToRelease)
427 {
429 }
430}
◆ RequestBundleAsset()
template<typename T >
| void UDataBundleRegistry::RequestBundleAsset |
( |
FGameplayTag |
BundleTag, |
|
|
const TSoftObjectPtr< T > & |
AssetPtr, |
|
|
TFunction< void(T *)> |
OnReady |
|
) |
| |
번들을 비동기 로드한 뒤 에셋 포인터를 콜백으로 전달합니다.
번들이 이미 로드된 경우 콜백이 즉시 실행됩니다.
- 템플릿 파라메터
-
- 매개변수
-
| BundleTag | 로드할 번들 태그. |
| AssetPtr | 요청할 에셋의 소프트 포인터. |
| OnReady | 로드 완료 시 호출될 콜백 (T* 인자). |
312{
313 TSoftObjectPtr<T> AssetCapture = AssetPtr;
314
315 RequestLoad(BundleTag, [
this, BundleTag, AssetCapture, OnReady = MoveTemp(OnReady)]()
316 {
317 T* Asset = AssetCapture.Get();
318
319 if (Asset == nullptr)
320 {
321 LOG_WARNING(LogCKAsset,
"RequestBundleAsset: 번들 '%s' 로드 완료 후에도 에셋을 찾을 수 없습니다: %s", *BundleTag.ToString(), *AssetCapture.ToString());
322 }
323
324 if (OnReady)
325 {
326 OnReady(Asset);
327 }
328 });
329}
◆ RequestLoad() [1/2]
| void UDataBundleRegistry::RequestLoad |
( |
const FGameplayTagContainer & |
BundleTags, |
|
|
TFunction< void(TArray< UDataBundleDefinition * >)> |
OnAllReady |
|
) |
| |
여러 번들을 비동기 로드합니다. 모든 번들 로드 완료 시 OnAllReady 콜백을 호출합니다.
빈 배열이 전달되면 OnAllReady가 즉시 호출됩니다.
- 매개변수
-
| BundleTags | 로드할 번들 태그 목록. |
| OnAllReady | 모든 번들 로드 완료 시 실행할 콜백 (로드된 번들 정의 배열). |
122{
123 bool bEarlyExit = false;
124
125 if (BundleTags.IsEmpty() && OnAllReady)
126 {
127 OnAllReady({});
128 bEarlyExit = true;
129 }
130
131 if (bEarlyExit)
132 {
133 return;
134 }
135
136 auto SharedCallback = MakeShared<TFunction<void(TArray<UDataBundleDefinition*>)>>(MoveTemp(OnAllReady));
137 TSharedRef<int32> PendingCount = MakeShared<int32>(BundleTags.Num());
138 TSharedRef<TArray<UDataBundleDefinition*>> AllDefs = MakeShared<TArray<UDataBundleDefinition*>>();
139
141 {
142 AllDefs->Add(Def);
143
144 if (--(*PendingCount) > 0)
145 {
146 return;
147 }
148
149 if (*SharedCallback)
150 {
151 (*SharedCallback)(*AllDefs);
152 }
153 };
154
155 for (const FGameplayTag& Tag : BundleTags)
156 {
158 }
159}
◆ RequestLoad() [2/2]
| void UDataBundleRegistry::RequestLoad |
( |
FGameplayTag |
BundleTag, |
|
|
TFunction< void(UDataBundleDefinition *)> |
OnReady = nullptr |
|
) |
| |
번들을 비동기 로드합니다. 로드 완료 시 OnReady 콜백을 호출합니다.
- 매개변수
-
| BundleTag | 로드할 번들의 GameplayTag. |
| OnReady | 번들 로드 완료 시 실행할 콜백. |
163{
165 {
166 LOG_ERROR(LogCKAsset,
"등록되지 않은 번들: %s", *BundleTag.ToString());
167
168 if (OnReady)
169 {
170 OnReady(nullptr);
171 }
172
173 return;
174 }
175
176 FBundleEntry& Entry =
Entries.FindOrAdd(BundleTag);
177
178 switch (Entry.State)
179 {
180
181 case EDataBundleState::Unloaded:
182 {
183 Entry.State = EDataBundleState::Loading;
184 if (OnReady)
185 {
186 Entry.PendingCallbacks.Add(MoveTemp(OnReady));
187 }
189 break;
190 }
191
192
193 case EDataBundleState::Loading:
194 {
195 if (OnReady)
196 {
197 Entry.PendingCallbacks.Add(MoveTemp(OnReady));
198 }
199 break;
200 }
201
202
203 case EDataBundleState::Loaded:
204 {
205 if (OnReady)
206 {
208 }
209 break;
210 }
211 }
212}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
void OnAllDependenciesReady(FGameplayTag BundleTag)
의존 번들이 모두 로드됐을 때 호출됩니다. 본 번들의 에셋 스트리밍을 시작합니다.
Definition DataBundleRegistry.cpp:215
◆ ScanAndRegisterBundles()
| void UDataBundleRegistry::ScanAndRegisterBundles |
( |
| ) |
|
|
private |
AssetManager에서 DataBundle 타입 에셋을 스캔해 Definitions에 등록합니다.
49{
50 UAssetManager& AssetManager = UAssetManager::Get();
51 TArray<FPrimaryAssetId> BundleIds;
52
53
54 AssetManager.GetPrimaryAssetIdList(FPrimaryAssetType(TEXT("DataBundle")), BundleIds);
55
56 for (const FPrimaryAssetId& AssetId : BundleIds)
57 {
58
59 UDataBundleDefinition* Def = Cast<UDataBundleDefinition>(AssetManager.GetPrimaryAssetObject(AssetId));
60
61 if (Def == nullptr)
62 {
63 FSoftObjectPath AssetPath = AssetManager.GetPrimaryAssetPath(AssetId);
64 Def = Cast<UDataBundleDefinition>(AssetPath.TryLoad());
65 }
66
67 if (Def == nullptr)
68 {
69 LOG_WARNING(LogCKAsset,
"DataBundleDefinition 로드 실패: %s", *AssetId.ToString());
70 continue;
71 }
72
74 {
75 LOG_WARNING(LogCKAsset,
"BundleTag가 유효하지 않습니다: %s", *AssetId.ToString());
76 continue;
77 }
78
80 {
82 }
83
86
88 }
89
91}
TArray< TSoftObjectPtr< IDataAssetBundle > > Assets
Definition DataBundleDefinition.h:51
FGameplayTag BundleTag
Definition DataBundleDefinition.h:39
◆ Definitions
번들 태그 → 정의 에셋 맵. UPROPERTY로 GC를 방지합니다.
◆ Entries
| TMap<FGameplayTag, FBundleEntry> UDataBundleRegistry::Entries |
|
private |
◆ Instance
이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: