데이터 테이블 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개 미만) |
구조 복잡성 | 단순한 구조체 | 복잡한 객체 구조 |
로딩 방식 | 전체 로드 | 선택적 로드 |
편집 방식 | 외부 툴 + 에디터 | 에디터 중심 |
기획 협업 | 우수 | 보통 |
개발 유연성 | 보통 | 우수 |
언리얼 엔진에서 효율적인 데이터 관리를 위해서는 프로젝트의 규모와 특성에 맞는 방식을 선택하는 것이 중요합니다.
대량의 정형화된 데이터는 데이터 테이블로, 개별적이고 복잡한 오브젝트는 데이터 에셋으로 관리하는 것을 권장합니다.
'원티드_언리얼RPG 2기 > 언리얼' 카테고리의 다른 글
GAS 리플리케이션 관련 자동화 (4) | 2025.06.08 |
---|---|
애니메이션 몽타주(Animation Montage)란? (2) | 2025.06.08 |
GAS(GameplayAbilitySystem) - 2편 (0) | 2025.05.21 |
GAS(GameplayAbilitySystem) - 1편 (0) | 2025.05.21 |
데이터 테이블 관리하기 (0) | 2025.05.20 |