Unity人工智能实战(原书第2版)
上QQ阅读APP看书,第一时间看更新

1.12 通过优先级混合多个行为

有时候权重混合并不够,因为权重很高的行为会削弱权重很低的行为,而低权重的行为也需要存在感。这时候基于优先级的混合就登场了,从高优先级行为到低优先级行为应用级联效果。

准备工作

这种基于优先级的混合方式与前一节中的非常相似。我们需要添加一个新的成员变量到AgentBehaviour类中,还要重构Update函数,把priority作为参数放进Agent类的SetSteering函数中。新的AgentBehaviour类应该类似下面这样:

操作步骤

现在我们需要对Agent类做一些修改:

1. 从库中添加一个新的命名空间:

2. 添加一个成员变量,用于表示最小的steering值,因为有多个行为:

3. 添加一个成员变量,用于存储这些行为的结果值:

4. 在Start函数中初始化变量:

5. 修改LateUpdate函数,通过调用GetPrioritySteering设置steering变量的值:

6. 修改SetSteering函数的签名和定义,以便在相应的优先级组别中存储steering值:

7. 实现GetPrioritySteering函数,以便过滤steering的分组:

运行原理

通过创建优先级组,把优先级相同的行为混合起来,选中steering值超过阈值的第一个组,否则选中优先级最低的组中的steering值。

延伸阅读

我们可以把这个基于优先级的方法与权重混合搭配在一起进行扩展,这样就可以拥有更健壮的架构,这种方式下,在每个优先级中对agent产生影响的行为更准确:

其他参考

还有一个利用基于优先级的混合技术实现避开墙体的示例。