使用 DataTable 和 UObject 扩展您的技能
如何将数字数据与复杂的噱头分开
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
如果您在 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 语句中。