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所示。
另外还可以定义OnDrawGizmos函数,以便有一个更好的路径视觉参考: