게임 개발/Unreal Engine 기본

Unreal Engine의 Data Table과 TSoftObjectPtr 활용한 응

지노윈 2026. 1. 2. 14:07
반응형

데이터 테이블(Data Table)과 TSoftObjectPtr을 결합하는 방식은 대규모 RPG나 수집형 게임에서 메모리 효율을 극대화하는 핵심 설계 패턴입니다. 모든 아이템 정보를 담은 데이터 테이블이 메모리에 올라와 있어도, 실제 사용되는 리소스(메쉬, 텍스처)는 필요한 순간에만 로드하기 때문입니다.


구조체(Struct) 정의

먼저 데이터 테이블의 행(Row)이 될 구조체를 정의합니다. 이때 리소스는 반드시 TSoftObjectPtr로 선언합니다.

C++
 
USTRUCT(BlueprintType)
struct FItemData : public FTableRowBase
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    FString ItemName;

    // 하드 참조가 아닌 소프트 참조로 선언!
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    TSoftObjectPtr<UStaticMesh> ItemMesh;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    TSoftObjectPtr<UTexture2D> ItemIcon;
};

에셋 관리자(Asset Manager)를 통한 로드 제어

데이터 테이블에서 특정 아이템 정보를 가져와 비동기 로드하는 로직을 구현합니다.

void AMyCharacter::EquipItem(FName ItemRowName)
{
    // 1. 데이터 테이블에서 정보 가져오기
    static const FString ContextString(TEXT("ItemContext"));
    FItemData* Data = ItemDataTable->FindRow<FItemData>(ItemRowName, ContextString);

    if (Data)
    {
        // 2. 이미 로드되어 있는지 확인
        if (Data->ItemMesh.IsValid())
        {
            ApplyItemMesh(Data->ItemMesh.Get());
        }
        else
        {
            // 3. 비동기 로드 요청
            FStreamableManager& Loader = UAssetManager::GetStreamableManager();
            
            // 람다(Lambda)를 사용하면 콜백 함수를 따로 만들지 않아도 되어 편리합니다.
            Loader.RequestAsyncLoad(Data->ItemMesh.ToSoftObjectPath(), 
                FStreamableDelegate::CreateLambda([this, Data]() {
                    if (Data->ItemMesh.IsValid())
                    {
                        ApplyItemMesh(Data->ItemMesh.Get());
                    }
                })
            );
        }
    }
}

이 구조를 사용하면 데이터 테이블 자체는 가벼운 "텍스트/경로 정보"만 들고 있게 됩니다.


실무에서 아주 유용한 "Primary Asset Label" 팁

데이터 테이블에 등록된 수많은 TSoftObjectPtr 에셋들을 나중에 한꺼번에 패키징하거나 관리하기 어려울 때가 있습니다.

  • Asset Manager 설정: 프로젝트 세팅의 Asset Manager에서 특정 폴더나 데이터 테이블을 등록해두면, 게임 빌드 시 해당 에셋들이 누락되지 않도록 자동으로 관리할 수 있습니다.
  • 번들(Bundles): "InGame", "Menu", "Cinematic" 같은 태그를 붙여, 특정 상황에서 필요한 에셋 뭉치만 한 번에 로드하는 기능도 지원합니다.

요약: 데이터 테이블 활용 전략

  1. 데이터 테이블 로드: 게임 시작 시 혹은 필요한 시점에 테이블을 로드합니다 (텍스트 데이터라 매우 가벼움).
  2. 리소스 참조: 테이블 내부의 TSoftObjectPtr을 통해 필요한 에셋의 경로만 파악합니다.
  3. 지연 로딩: 실제 아이템이 화면에 그려지기 직전에 비동기로 로드합니다.
  4. 메모리 해제: 해당 아이템을 더 이상 쓰지 않으면 참조를 해제하여 GC가 수거하게 합니다.
반응형