Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
DataBundleRegistry.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Subsystems/GameInstanceSubsystem.h"
7#include "GameplayTagContainer.h"
9#include "CK_UE.h"
10#include "DataBundleRegistry.generated.h"
11
12
13struct FStreamableHandle;
14
17DECLARE_MULTICAST_DELEGATE_OneParam(FOnBundleStateChanged, FGameplayTag /*BundleTag*/);
18
19
20
24UENUM(BlueprintType)
25enum class EDataBundleState : uint8
26{
27 Unloaded UMETA(DisplayName = "언로드됨"),
28 Loading UMETA(DisplayName = "로딩 중"),
29 Loaded UMETA(DisplayName = "로드됨"),
30};
31
32
43UCLASS()
44class CK_UE_API UDataBundleRegistry : public UGameInstanceSubsystem
45{
46 GENERATED_BODY()
47
48public:
50 virtual void Initialize(FSubsystemCollectionBase& Collection) override;
51
53 virtual void Deinitialize() override;
54
55public:
62 void RequestLoad(FGameplayTag BundleTag, TFunction<void()> OnReady = nullptr);
63
72 void RequestLoad(const TArray<FGameplayTag>& BundleTags, TFunction<void()> OnAllReady);
73
79 UFUNCTION(BlueprintCallable, Category = "Bundle")
80 void Release(FGameplayTag BundleTag);
81
87 UFUNCTION(BlueprintCallable, Category = "Bundle")
88 void ForceRelease(FGameplayTag BundleTag);
89
96 UFUNCTION(BlueprintCallable, Category = "Bundle")
97 EDataBundleState GetState(FGameplayTag BundleTag) const;
98
105 UFUNCTION(BlueprintCallable, Category = "Bundle")
106 bool IsLoaded(FGameplayTag BundleTag) const;
107
113 UFUNCTION(BlueprintCallable, Category = "Bundle")
114 TArray<FGameplayTag> GetLoadedBundles() const;
115
123 void ReleaseUnusedBundles(const TArray<FGameplayTag>& RequiredTags);
124
136 template <typename T>
137 T* GetBundleAsset(FGameplayTag BundleTag, const TSoftObjectPtr<T>& AssetPtr) const;
138
149 template <typename T>
150 void RequestBundleAsset(FGameplayTag BundleTag, const TSoftObjectPtr<T>& AssetPtr, TFunction<void(T*)> OnReady);
151
152private:
154 void ScanAndRegisterBundles();
155
157 void PreLoadBundles();
158
164 void OnAllDependenciesReady(FGameplayTag BundleTag);
165
173 void OnAssetsLoaded(FGameplayTag BundleTag);
174
180 void FlushPendingCallbacks(FGameplayTag BundleTag);
181
182 void NotifyBundleLoadedToAssets(const TArray<UObject*>& Assets, FGameplayTag BundleTag);
183 void NotifyBundleReleasedToAssets(const TArray<UObject*>& Assets, FGameplayTag BundleTag);
184
185private:
192 {
194 TSharedPtr<FStreamableHandle> Handle;
195
197 EDataBundleState State = EDataBundleState::Unloaded;
198
200 TArray<TFunction<void()>> PendingCallbacks;
201 };
202
204 UPROPERTY(Transient)
205 TMap<FGameplayTag, TObjectPtr<UDataBundleDefinition>> Definitions;
206
208 TMap<FGameplayTag, FBundleEntry> Entries;
209};
210
211
212#pragma region Template Implementations
213
214template <typename T>
215T* UDataBundleRegistry::GetBundleAsset(FGameplayTag BundleTag, const TSoftObjectPtr<T>& AssetPtr) const
216{
217 if (IsLoaded(BundleTag) == false)
218 {
219 LOG_WARNING(LogCKAsset, "번들 '%s'이 로드되지 않은 상태에서 GetBundleAsset 호출됨.", *BundleTag.ToString());
220 return nullptr;
221 }
222
223 T* Asset = AssetPtr.Get();
224
225 if (Asset == nullptr)
226 {
227 LOG_WARNING(LogCKAsset, "번들 '%s'의 에셋 '%s'이 메모리에 없습니다.", *BundleTag.ToString(), *AssetPtr.ToString());
228 }
229
230 return Asset;
231}
232
233
234template <typename T>
235void UDataBundleRegistry::RequestBundleAsset(FGameplayTag BundleTag, const TSoftObjectPtr<T>& AssetPtr, TFunction<void(T*)> OnReady)
236{
237 TSoftObjectPtr<T> AssetCapture = AssetPtr;
238
239 RequestLoad(BundleTag, [this, BundleTag, AssetCapture, OnReady = MoveTemp(OnReady)]()
240 {
241 T* Asset = AssetCapture.Get();
242
243 if (Asset == nullptr)
244 {
245 LOG_WARNING(LogCKAsset, "RequestBundleAsset: 번들 '%s' 로드 완료 후에도 에셋을 찾을 수 없습니다: %s", *BundleTag.ToString(), *AssetCapture.ToString());
246 }
247
248 if (OnReady)
249 {
250 OnReady(Asset);
251 }
252 });
253}
254
255#pragma endregion
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:31
DECLARE_MULTICAST_DELEGATE_OneParam(FOnBundleStateChanged, FGameplayTag)
번들 로드/언로드 상태 변경 시 브로드캐스트되는 델리게이트.
EDataBundleState
DataBundle의 런타임 로드 상태를 나타내는 열거형.
Definition DataBundleRegistry.h:26
Definition DataBundleDefinition.h:28
DataBundle의 로드/언로드를 관리하는 GameInstance 서브시스템.
Definition DataBundleRegistry.h:45
void RequestLoad(FGameplayTag BundleTag, TFunction< void()> OnReady=nullptr)
번들을 비동기 로드합니다. 로드 완료 시 OnReady 콜백을 호출합니다.
Definition DataBundleRegistry.cpp:141
T * GetBundleAsset(FGameplayTag BundleTag, const TSoftObjectPtr< T > &AssetPtr) const
로드된 번들에서 특정 에셋을 동기적으로 반환합니다.
Definition DataBundleRegistry.h:215
bool IsLoaded(FGameplayTag BundleTag) const
번들이 로드 완료 상태인지 여부를 반환합니다.
Definition DataBundleRegistry.cpp:341
void RequestBundleAsset(FGameplayTag BundleTag, const TSoftObjectPtr< T > &AssetPtr, TFunction< void(T *)> OnReady)
번들을 비동기 로드한 뒤 에셋 포인터를 콜백으로 전달합니다.
Definition DataBundleRegistry.h:235
번들 하나의 런타임 상태를 담는 구조체.
Definition DataBundleRegistry.h:192
TSharedPtr< FStreamableHandle > Handle
에셋 스트리밍 핸들. 언로드 시 명시적으로 해제됩니다.
Definition DataBundleRegistry.h:194
TArray< TFunction< void()> > PendingCallbacks
로드 완료 시 일괄 실행할 콜백 목록.
Definition DataBundleRegistry.h:200