← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-10

DataTable과 UObject로 스킬 확장하기

수치 데이터와 복잡한 기믹을 분리하는 방법

INTERACTIVE READING MODE →

본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.

유닛마다 스탯과 특성을 C++ 생성자에 전부 적으면 밸런스를 바꿀 때마다 다시 빌드해야 한다. ProjectTB에서는 수치 데이터와 복잡한 행동을 분리했다.

단순 수치는 DataTable

레벨별 체력, 공격력, 필요한 경험치처럼 행과 열로 표현하기 좋은 값은 DataTable에 둔다.

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Progression")
TObjectPtr<UDataTable> UnitProgressionTable;

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Progression")
TObjectPtr<UDataTable> UnitTraitTable;

기획 값이 바뀌어도 C++ 로직은 그대로 유지할 수 있다. 하지만 모든 행동을 이름 문자열과 수치만으로 표현하려 하면 조건문이 거대해진다.

복잡한 기믹은 UObject

ProjectTB의 UTBUnitSkill과 UTBUnitTrait은 교체 가능한 UObject다.

UFUNCTION(BlueprintNativeEvent)
bool Activate(ATBUnitBase* TargetUnit, ATBHexTile* TargetTile);

UFUNCTION(BlueprintNativeEvent)
int32 ModifyOutgoingDamage(
    ATBUnitBase* TargetUnit,
    int32 Damage
) const;

특성마다 피해 전후, 회복, 행동 시작과 종료, 처치 이벤트를 오버라이드할 수 있다.

DataTable의 TraitClass에는 어떤 UObject 클래스를 생성할지 기록한다.

DataTable
이름 / 설명 / 수치 / TraitClass
                    ↓
UTBUnitTrait 파생 클래스
실제 기믹 실행

DataTable은 데이터를 관리하고 UObject는 행동을 캡슐화한다. 두 방식을 섞으면 단순 수치 특성 때문에 클래스를 만들 필요도 없고, 복잡한 특성을 거대한 switch문에 넣을 필요도 없다.