1.10 避开墙体

本节中要实现的行为效仿人类的能力,当我们面前有一堵墙或者障碍时,通过设置安全距离去避开墙体,同时试着不偏离大方向。

准备工作

这项技术使用物理引擎中的RaycastHit结构体和Raycast函数,所以建议读者复习一下相关文档,以便快速理解本节的主题。

操作步骤

得益于之前内容的介绍,该方法的介绍会比较短:

1. 创建继承于SeekAvoidWall行为:

2. 添加用于定义安全距离和射线长度的成员变量:

3. 定义Awake函数,用于初始化游戏对象:

4. 定义后面的步骤要用到的GetSteering函数:

5. 声明并设置射线所需要的变量:

6. 发射射线并在射线遇到墙体时做出合理的计算:

运行原理

向agent前方发射一条射线,当射线遇到墙体时,目标对象被就放置到新的位置上,此位置要考虑到到墙的安全距离,然后把转向的计算委托给Seek行为,这样就产生了agent会避开墙的幻觉。

延伸阅读

我们可以通过添加更多射线扩展这个行为,就像胡须一样,以提高准确度,如图1-5所示。另外,这个行为通常与其他移动行为混合搭配使用,比如追赶(Pursue)。

图1-5 原始射线和用于更精确地避开墙体的扩展射线

其他参考

关于RaycastHit结构体和Raycast函数的更多信息,请参考网站的官方文档:

http://docs.unity3d.com/ScriptReference/RaycastHit.html

http://docs.unity3d.com/ScriptReference/Physics.Raycast.html