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

1.8 按路径移动

很多时候当我们需要像剧本一样的线路时,难以想象完全用代码实现。假如你正在开发一款潜行类游戏(stealth game)时,每个守卫的路线你都会用代码实现吗?这项技术将帮助你为这些情况构建一套灵活的寻路系统。

准备工作

需要定义一个叫作PathSegment的自定义数据类型:

操作步骤

该方法有两大步骤。首先,构建Path类,它从特定的空间表达式中提取路径中的点位;然后构建PathFollower行为,利用提取的点位得到实际要跟踪的空间点位:

1. 创建Path类,包含节点和线段,但只有节点是公共的,并且需要手动赋值:

2. 定义Start函数来在场景开始时给线段赋值:

3. 定义GetSegments函数来从节点构建线段:

4. 定义第一个函数GetParam,用于提取点位:

5. 找出离agent最近的线段:

6. 根据当前位置,我们需要计算出路径的走向:

7. 使用向量投影找到线段中的点:

8. GetParam函数返回沿着路径下一个要到达的点位:

9. 定义GetPosition函数:

10. 根据路径中的当前位置,找到对应的线段:

11. GetPosition把参数转换为一个空间点位,把它作为返回值:

12. 创建继承于Seek类的PathFollower行为(记得设置执行顺序):

13. 实现Awake函数以初始化目标对象:

14. 最后一步是定义GetSteering函数,它依赖于由Path类创建的抽象,以便设置目标点位,然后应用Seek类:

运行原理

使用Path类是为了有一条移动的指引路线。这是算法的基础,因为它依靠GetParam去映射一个偏移点以跟踪其内部的指引路线,然后使用GetPosition把参考点转换成沿着线段的三维空间点。

路径跟踪算法就是利用Path类的函数得到一个新的点位,更新目标,然后再应用Seek类。

其他参考

注意在Inspector窗口中设置路径节点的链接顺序是很重要的,有一个实用的方法是手动用数字命名这些节点,如图1-3所示。

图1-3 在Inspector窗口中设置路径的示例

另外还可以定义OnDrawGizmos函数,以便有一个更好的路径视觉参考: