- Unity人工智能实战(原书第2版)
- (智利)豪尔赫·帕拉西奥斯
- 501字
- 2021-01-07 11:17:06
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产生影响的行为更准确:
其他参考
还有一个利用基于优先级的混合技术实现避开墙体的示例。