데이터 테이블 VS 데이터 에셋

2025. 6. 6. 10:09원티드_언리얼RPG 2기/언리얼

개요 

이전 글에서 데이터 테이블을 통해 캐릭터스텟을 관리하는법을 공부했습니다. 하지만 언리얼엔진에서 데이터 에셋을 활용하는 방법도 있어서 데이터 테이블과 데이터 에셋의 차이점과 장단점이 궁금해졌습니다. 각각의 활용 방법을 C++ 코드 예제와 함께 살펴보겠습니다.

 

 

 

데이터 테이블 (Data Table)

 

 

 


주요 특징

 

데이터 테이블은 대량의 구조화된 데이터를 관리하기에 적합한 방식입니다.

 

✅ 장점

  • 외부 파일 연동: CSV, JSON 등의 파일로 관리가 가능해 기획자와의 협업이 용이
  • Import/Export 지원: 에디터에서 쉽게 데이터를 내보내고 가져올 수 있음
  • 대용량 데이터 관리: 수백, 수천 개의 아이템이나 캐릭터 데이터를 효율적으로 관리
  • 일관된 구조: 모든 데이터가 동일한 구조체를 따라 일관성 유지

❌ 단점

  • 불필요한 데이터 로딩: 하나의 정보만 필요해도 전체 테이블을 메모리에 로드
  • 초기 로딩 시간: 큰 테이블의 경우 게임 시작 시 로딩 시간이 길어질 수 있음
  • 런타임 수정 제약: 게임 실행 중 개별 데이터 수정이 어려움

 

 

데이터 에셋 (Data Asset)

 

 


주요 특징

데이터 에셋은 개별적이고 유연한 데이터 관리에 특화된 방식입니다.

 

 

✅ 장점

  • 직관적인 에디터: 언리얼 에디터에서 직접 편집 가능한 사용자 친화적 인터페이스
  • 객체 지향 구조: 상속과 계층 구조를 활용한 유연한 데이터 설계
  • 블루프린트 연동: 블루프린트와의 뛰어난 호환성으로 디자이너 작업 효율성 향상
  • 유연한 계층: 테이블보다 더 복잡하고 다양한 구조 구성 가능
  • 엔진 내장 활용: 입력 매핑 컨텍스트 등 엔진의 핵심 기능도 데이터 에셋으로 구현
  • 세분화된 관리: 작은 단위의 정보를 개별적으로 관리하기에 최적화
  • 빠른 로딩: 필요한 에셋만 선택적으로 로드하여 메모리 효율성 극대화
  • 특화된 용도: 무기, 적 캐릭터, 아이템 등 개별 오브젝트 정보 관리에 특히 유용

❌ 단점

  • 관리 복잡성: 에셋 수가 많아질 경우 파일 관리가 복잡해질 수 있음
  • 일관성 유지: 개별 관리로 인한 데이터 일관성 확보에 주의 필요

 

 

💻 C++ 구현 예제


데이터 테이블 접근 방식

// ItemData 구조체 정의
USTRUCT(BlueprintType)
struct FItemData : public FTableRowBase
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    FString ItemName;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    int32 Damage;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    float Weight;
};

// 테이블 전체 로드 후 특정 행 검색
UDataTable* ItemTable = LoadObject<UDataTable>(nullptr, TEXT(\"/Game/Data/ItemTable\"));
if (ItemTable)
{
    FItemData* ItemData = ItemTable->FindRow<FItemData>(TEXT(\"Sword001\"), TEXT(\"\"));
    if (ItemData)
    {
        UE_LOG(LogTemp, Warning, TEXT(\"Item: %s, Damage: %d\"), *ItemData->ItemName, ItemData->Damage);
    }
}

데이터 에셋 접근 방식

// ItemDataAsset 클래스 정의
UCLASS(BlueprintType)
class YOURGAME_API UItemDataAsset : public UDataAsset
{
    GENERATED_BODY()

public:
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Item Info\")
    FString ItemName;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Item Info\")
    int32 Damage;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Item Info\")
    float Weight;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Item Info\")
    UTexture2D* ItemIcon;
};

// 필요한 에셋만 개별 로드
UItemDataAsset* SwordAsset = LoadObject<UItemDataAsset>(nullptr, TEXT(\"/Game/Data/Items/Sword001\"));
if (SwordAsset)
{
    UE_LOG(LogTemp, Warning, TEXT(\"Item: %s, Damage: %d\"), *SwordAsset->ItemName, SwordAsset->Damage);
}

 

 

데이터 테이블 추천 상황

  • 대량 아이템 관리: RPG 게임의 수백 개 아이템 데이터
  • 캐릭터 스탯: 레벨별 능력치, 경험치 테이블
  • 기획 협업: 기획자가 Excel로 작업하는 데이터
  • 지역화: 다국어 텍스트 관리

데이터 에셋 추천 상황

  • 고유 보스: 각각 다른 패턴을 가진 보스 몬스터
  • 특별 아이템: 고유한 능력과 이펙트를 가진 레전더리 아이템
  • 레벨 설정: 각 스테이지의 독특한 환경 설정
  • UI 설정: 메뉴별 고유한 인터페이스 구성

 

 

 

📋 정리


기준 데이터 테이블 데이터 에셋
데이터 규모 대량 (100개 이상) 소량~중간 (100개 미만)
구조 복잡성 단순한 구조체 복잡한 객체 구조
로딩 방식 전체 로드 선택적 로드
편집 방식 외부 툴 + 에디터 에디터 중심
기획 협업 우수 보통
개발 유연성 보통 우수

 

 

언리얼 엔진에서 효율적인 데이터 관리를 위해서는 프로젝트의 규모와 특성에 맞는 방식을 선택하는 것이 중요합니다.

대량의 정형화된 데이터는 데이터 테이블로, 개별적이고 복잡한 오브젝트는 데이터 에셋으로 관리하는 것을 권장합니다.