参数化与复用:一个 StateTree 服务多种敌人
数据驱动思想在 StateTree 上的落地方式与行为树类似:一份状态资产 + 参数差异 = 多种 AI。
参数化的三个层次
| 层次 | 手段 | 例子 |
|---|---|---|
| 状态参数 | StateTree 编辑器里的参数变量 | 战斗状态的攻击距离、追击速度 |
| 外部数据 | Context(上下文对象,引用 Pawn / 组件) | 读 Pawn 的血量组件决定撤退 |
| 数据表 | 按敌人类型查表 | 近战兵 / 远程兵 / Boss 的参数行 |
实操:一套状态树服务三种敌人
- StateTree 参数化:
AttackRange、ChaseSpeed、RetreatHP暴露为变量; - 三种敌人的差异 = 参数差异:
| 敌人 | AttackRange | ChaseSpeed | RetreatHP |
|---|---|---|---|
| 近战兵 | 2.0m | 300 | 20% |
| 远程兵 | 15.0m | 200 | 30% |
| Boss | 5.0m | 400 | 10% |
- AIController 生成时按敌人类型从数据表取参数,赋给 StateTree 实例。
与行为树的参数化对比
行为树的参数暴露在黑板 / 节点属性上,StateTree 的参数更"原生"(它是编辑器里的一等公民,类型检查更严格)。StateTree 参数 + 数据表的组合,在多人项目里尤其顺手:策划调数值不动资产。
复用的边界
- 行为差异大 = 换状态树:如果两种敌人的状态结构本身不同(Boss 有三阶段而小兵只有一阶段),不要强行用参数抹平,直接做两套;
- 结构相同数值不同 = 参数化:这是无脑复用的安全区。
