1. 애셋 매니저
- 애셋 매니저는 싱글턴 객체이다.
- 애셋 매니저는 생명 주기가 엔진 서브 시스템과 비슷하다.
- 애셋 매니저는 애셋을 보관한다.
- 애셋 매니저는 애셋을 글로벌로 관리한다. (어디서든 접근 가능하다)
- 게임에 필요한 애셋들의 검색, 로드, 언로드 등을 제어한다.
2. 애셋 매니저는 언제 사용할까?
- 큰 규모의 프로젝트에서 메모리 관리를 위해 로드할 애셋과 로드하지 않을 애셋을 구분할 때 사용한다.
- 예를 들어 화이트 리스트 목록이라고 생각하면 편할 것 같다. (필요한 애셋들을 애셋 매니저에 등록해 사용한다.)
2. 애셋 매니저 구성 요소
언리얼에서 애셋은 두 가지 타입으로 구분할 수 있다.
- Primary Asset
- Secondary Asset
2.1 Primary Asset
기본적으로 주요 자산(PrimaryAsset)은 최상위 계층에 있는 것들을 말한다.
대표적인 예로 Level이 있다.
하지만 게임에 필요한 물약, 무기 등도
GetPrimaryAssetId() 함수를 오버라이드하면
주요 자산이 될 수 있으며 애셋 매니저에 등록할 수 있다.
2.2 Secondary Asset
2차 자산은 주요 자산 외 모든 자산을 의미한다.
애셋 매니저가 직접 관리하지 않는다.
3. 애셋 매니저 활용
애셋 매니저 - 접근하기
UAssetManager& AssetManager = UAssetManager::Get();
애셋 매니저 - 애셋 ID 목록 가져오기
TArray<FPrimaryAssetId> WeaponIdList;
AssetManager.GetPrimaryAssetIdList(WeaponItemType, WeaponIdList);
- WeaponItemType은 FPrimaryAssetType구조체이다.
- WeaponItemType에 해당하는 FPrimaryAssetId들을 가져온다.
- 애셋을 로드하지 않고 메타데이터만 가져온다.
애셋 ID - 애셋 데이터 가져오기
for (const FPrimaryAssetId& WeaponId : WeaponIdList)
{
FAssetData AssetDataToParse;
AssetManager.GetPrimaryAssetData(WeaponId, AssetDataToParse);
}
- 애셋 ID로 애셋 데이터를 가져올 수 있다.
애셋 데이터 - 게임 플레이 태그 가져오기
for (const FPrimaryAssetId& WeaponId : WeaponIdList)
{
FAssetData AssetDataToParse;
AssetManager.GetPrimaryAssetData(WeaponId, AssetDataToParse);
FString GameplayTagString;
FGameplayTag LoadedTag;
AssetDataToParse.GetTagValue(GET_MEMBER_NAME_CHECKED(URPGItem, ExampleRegistryTag), GameplayTagString);
LoadedTag.FromExportString(GameplayTagString);
}
애셋 매니저 - 애셋 로드하기 (동기)
UObject* ULyraAssetManager::SynchronousLoadAsset(const FSoftObjectPath& AssetPath)
{
if (AssetPath.IsValid())
{
if (UAssetManager::IsInitialized())
{
return UAssetManager::GetStreamableManager().LoadSynchronous(AssetPath, false);
}
// Use LoadObject if asset manager isn't ready yet.
return AssetPath.TryLoad();
}
return nullptr;
}
애셋 매니저 - 애셋 로드하기 (비동기)
// Permanently load a single item
TArray<FName> CurrentLoadState;
CurrentLoadState.Add(FName("Game"));
FName WeaponName = FName("Weapon_Hammer_3");
FPrimaryAssetId WeaponId = FPrimaryAssetId(WeaponItemType, WeaponName);
AssetManager.LoadPrimaryAsset(WeaponId, CurrentLoadState, FStreamableDelegate::CreateUObject(&AssetManager, &URPGAssetManager::CallbackFunction, WeaponId));
}
void URPGAssetManager::CallbackFunction(FPrimaryAssetId WeaponId)
{
URPGWeaponItem* Weapon = GetPrimaryAssetObject<URPGWeaponItem>(WeaponId);
if (Weapon)
{
UE_LOG(LogTemp, Log, TEXT("Loaded Weapon %s"), *Weapon->GetName());
}
}
애셋 매니저 - 애셋 로드하기 (핸들이 메모리에 유지되는 동안만)
TArray<FPrimaryAssetId> ListOfPrimaryAssetIds;
AssetManager.GetPrimaryAssetIdList(SkillItemType, ListOfPrimaryAssetIds);
// Load a list of items as long as Handle is alive
TSharedPtr<FStreamableHandle> Handle = AssetManager.PreloadPrimaryAssets(ListOfPrimaryAssetIds, CurrentLoadState, false);
애셋 매니저 - 애셋 언로드하기
// Release previously loaded item
UnloadPrimaryAsset(WeaponId);
참고
'Unrael > Basic' 카테고리의 다른 글
| [Game] 게임 재미 이론 (0) | 2025.03.21 |
|---|---|
| [UE/Basic] 게임 저장 및 로딩 (0) | 2025.03.19 |
| [UE/Basic] 하드 레퍼런싱와 소프트 레퍼런싱 (0) | 2025.03.18 |
| [UE/Basic] FHitResult (0) | 2025.02.26 |
| [UE/Basic] 게임 콘텐츠 구조 (0) | 2025.02.10 |