← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-10

使用 DataTable 和 UObject 扩展您的技能

如何将数字数据与复杂的噱头分开

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

如果您在 C++ 构造函数中编写每个单元的所有统计数据和特征,则每次更改平衡时都必须重建它们。 ProjectTB 将数字数据与复杂行为分开。

简单的数字就是DataTable

可以用行和列表示的值,例如按等级划分的体力、攻击力和所需经验,都放置在数据表中。

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

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

即使规划值发生变化,C++ 逻辑也可以保持不变。 但是,如果您尝试仅使用名称字符串和数字来表达所有操作,则条件语句会变得很大。

复杂的噱头是 UObject

TB 计划UTBUnitSkill班级UTBUnitTrait是一个可替换的UObject。

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

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

对于每个属性,伤害、恢复、动作开始和结束以及杀死事件之前和之后的事件都可以被覆盖。

数据表TraitClass记录要创建的 UObject 类。

DataTable
名称/描述/数字/特征类别
                    ↓
UTBUnitTrait 派生类
实际噱头执行

DataTable 管理数据,UObject 封装行为。 通过混合这两种方法,不需要为简单的数值特征创建类,也不需要将复杂的特征放在巨大的 switch 语句中。