데이터 테이블 (DataTable)
- CSV 또는 Json과 같은 데이터 파일을 사용할 수 있다.
- CSV/Json같은 외부 파일을 이용해 데이터를 저장/불러오기 가능
- 에디터 내부에서도 데이터 입력 가능
- UStruct 기반의 데이터 구조를 고정해서 사용하다
- struct FDataTable : public FTableRowBase
- 확장이 어려우며, 다른 데이터 구조와 연결하기가 어렵다.
- 원하는 정보를 찾기 쉽다
- 런타임 환경에서 데이터테이블 Row들에 대한 수정이 불가능하다.
- TMap, TArray와 같은 컨테이너 타입의 사용이 불가능하다.
- TArray는 기본 자료형은 가능하다. (FText, float, FVector 등)
- 대화 / 퀘스트 시스템, 언어 시트, 게임 전역 설정, 경험치 요구량 또는 능력치 증가표 등에 적합하다.
사용 예시
1. NormalQuestDataTable.h
// 테이블 Row에 들어갈 값을 정의하는 구조체.
// FTableRowBase기반으로 구현한다.
USTRUCT(BlueprintType)
struct FQuestDataTable : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName QuestID;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FText QuestName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString QuestDescription;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 RewardXP;
//...
};
2. 언리얼 엔진 내 데이터테이블 생성 (Row Select)
정의한 구조체 기반의 데이터테이블을 생성할 수 있다.
3. 정의한 데이터테이블 Row관련 Column 정의
생성한 데이터 테이블을 에디터 레벨에서도 정의할 수 있다.
또한, 정의한 데이터 테이블을 CSV,Json 타입으로 변환이 가능하다.
4. DataTable 조회
// DataTable 조회 방법
for (const FName& RowName : RowNames)
{
FUIObjectBaseData* RowData = UICardInfoDataTable->FindRow<FUIObjectBaseData>(RowName, ContextString);
if (RowData && RowData->CardType == CardType)
{
UpdateCardUI(*RowData);
ApplyCardType = CardType;
ApplyValue = RowData->IncreaseAmount * GradeValue;
return;
}
}
어떤 Row를 기준으로 조회할 것인지, 그 후 Contaions, IsA와 같은 방법을 통해 원하는 Column을 가져올 수 있다.
데이터 에셋 (Data Asset)
- 에디터를 통해 데이터를 입력할 수 있다
- 작은 규모의 정보 저장에 적합하다
- 데이터 중첩 가능
- 개별 아이템 등을 위한 구조에 적합
- 확장성이 좋다. 재사용성 및 계층구조에 적합하다.
- TArray, FStruct, TMap등 컨테이너 구조를 활용한 데이터 관리가 가능하다.
- 데이터 테이블에 비해 로딩 속도가 빠르다
- Input Action, Weapon Data, Item Data 등 에디터 레벨에서 설정하는 것들
- DataPrimaryAsset을 통해 런타임 환경에서도 변경할 수 있다.
사용 예시
1. WeaponDataAsset.h
// 1. 무기 데이터를 리스트 형태로 하나의 데이터에셋에 관리하는 경우
USTRUCT(BlueprintType)
struct FWeaponInfo
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FName WeaponID;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FText DisplayName;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
int32 Damage;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
float Range;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UTexture2D* Icon;
};
// WeaponDataAsset_List.h
UCLASS(BlueprintType)
class UWeaponDataAsset_List : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TArray<FWeaponInfo> WeaponList;
};
// 2. 단일 무기에 대한 데이터 에셋의 경우
UCLASS(BlueprintType)
class UWeaponDataAsset : public UPrimaryDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FName WeaponID;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FText DisplayName;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
int32 Damage;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
float Range;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UStaticMesh* WeaponMesh;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
USoundBase* FireSound;
};
2. WeaponDataAsset VS WeaponDataAsset_List
DataAsset 내 데이터들을 선언이 가능하며, 해당 데이터들을 구조체를 활용하여 컨테이너를 사용한 데이터 관리가 가능하다.
3. DataTable_List 조회
// DataAsset 조회 방법
for (const auto& WeaponData : WeaponDataAssets->WeaponTextures)
{
if (WeaponData.WeaponClass == CurrentWeaponClass)
{
if (WeaponTexture && WeaponData.WeaponTexture)
{
WeaponTexture->SetBrushFromTexture(WeaponData.WeaponTexture);
}
return;
}
}
또는 IsA, Contains를 사용한 조회 가능.
출처 및 참고내역
https://dev.epicgames.com/community/learning/tutorials/jO8J/unreal-engine-vs
'Unreal Engine > 개념정리' 카테고리의 다른 글
[UE5] - 언리얼 프로젝트 및 C++ 구조, 빌드 프로세스 (0) | 2025.02.10 |
---|---|
[UE5] - UGameplayStatics (0) | 2025.02.05 |
[UE5] SpawnActorDeferred (지연된 스폰) (1) | 2025.02.03 |
[UE5] - 게임 플레이 프레임워크 (GameMode / GameState / PlayerController / PlayerState) + GameInstance (0) | 2025.01.31 |
[UE5] - Actor, Pawn, Character (1) | 2025.01.24 |