参数化与复用:一个 StateTree 服务多种敌人

数据驱动思想在 StateTree 上的落地方式与行为树类似:一份状态资产 + 参数差异 = 多种 AI。

参数化的三个层次

层次 手段 例子
状态参数 StateTree 编辑器里的参数变量 战斗状态的攻击距离、追击速度
外部数据 Context(上下文对象,引用 Pawn / 组件) 读 Pawn 的血量组件决定撤退
数据表 按敌人类型查表 近战兵 / 远程兵 / Boss 的参数行

实操:一套状态树服务三种敌人

  1. StateTree 参数化:AttackRange、ChaseSpeed、RetreatHP 暴露为变量;
  2. 三种敌人的差异 = 参数差异:
敌人 AttackRange ChaseSpeed RetreatHP
近战兵 2.0m 300 20%
远程兵 15.0m 200 30%
Boss 5.0m 400 10%
  1. AIController 生成时按敌人类型从数据表取参数,赋给 StateTree 实例。

与行为树的参数化对比

行为树的参数暴露在黑板 / 节点属性上,StateTree 的参数更"原生"(它是编辑器里的一等公民,类型检查更严格)。StateTree 参数 + 数据表的组合,在多人项目里尤其顺手:策划调数值不动资产。

复用的边界

  • 行为差异大 = 换状态树:如果两种敌人的状态结构本身不同(Boss 有三阶段而小兵只有一阶段),不要强行用参数抹平,直接做两套;
  • 结构相同数值不同 = 参数化:这是无脑复用的安全区。