[Gameplay] 애셋 매니저 (AssetManager)

2025. 4. 21. 23:26·Unrael/Basic

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);

 

참고

Asset Manager Explained | Inside Unreal

'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
'Unrael/Basic' 카테고리의 다른 글
  • [Game] 게임 재미 이론
  • [UE/Basic] 게임 저장 및 로딩
  • [UE/Basic] 하드 레퍼런싱와 소프트 레퍼런싱
  • [UE/Basic] FHitResult
DevColIn
DevColIn
복잡함을 단순하게
  • DevColIn
    심플한 코딩생활
    복잡함을 단순하게
  • 전체
    오늘
    어제
    • 전체보기 (223)
      • Unreal 부트캠프 (49)
        • TIL (34)
        • 사전캠프 (7)
        • 본캠프 (8)
      • Unrael (10)
        • 환경설정 (0)
        • Basic (19)
        • Component (5)
        • GAS (GameplayAbilitySystem) (3)
        • AI (2)
        • Implement (10)
        • UI (1)
        • Error (1)
        • Network (2)
        • Tip (1)
      • Level Design (5)
      • Math (1)
      • Design Pattern (16)
      • Computer Science (2)
        • Network (1)
        • Database (1)
      • Algorithm (79)
        • Basic (4)
        • Practice (74)
      • C++ (4)
        • Basic (4)
      • Tool (0)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AI
    gas
    소프트 레퍼런신
    Animation
    KPT회고
    하드 레퍼런싱
    basic
    assetmanager
    Algorithm
    actor
    component
    Design Pattern
    GameplayEffect
    Til
    액터
    디자인패턴
    본캠프
    게임동기화
    tsoftobjectptr
    Implement
    unreal
    디자인 패턴
    퀘스트
    unrealengine
    레벨디자인
    DesignPattern
    c++
    내일배움캠프
    사전캠프
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
DevColIn
[Gameplay] 애셋 매니저 (AssetManager)
상단으로

티스토리툴바