DataTableとUObjectでスキルを拡張する
数値データと複雑なギミックを分離する方法
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
ユニットごとにステータスと特性を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は動作をカプセル化します。 2つの方法を混ぜると単純な数値特性のためにクラスを作る必要もなく、複雑な特性を巨大なswitch文に入れる必要もない。