从A*到Navmesh都是完备的寻路方案,能满足任意距离的路径搜索。它们都需要根据场景预先生成相关数据(A*是规整的2D格子数据,Navmesh则是mesh数据),在场景尺寸确定的情况下,Navmesh算法的网格数会随障碍的复杂程度改变,而A*是固定的。就时空复杂度而言,通常情况下Navmesh要优于A*,但一些优化的变种A*算法(如:Hierarchy A*)在长距离寻路上要优于Navmesh。然而对于动态改变的场景障碍,在使用以上两种算法时都会有性能和设计上的限制。在实际项目中,我们通常将战斗约束在一定区域内,而且这些区域有可能是诸如移动平台之类的,此时A*和Navmesh可能会面临无法使用的境地。下面这个方案是在洗澡时突然想到的,确切点应该称之为避障算法,因为它源自之前做智能避障小车时的经验。
设,角色到目标点的方向向量为D0,投射线长度为L,探测间隙角为θ,N = 180 / θ,算法流程如下:
算法通过优先搜索目标方向左右无障碍空间,减少检测次数,通过设置θ和L可以控制检测精度和范围。此外,设置合适的Collision Matrix和检测频率可以约束RayCast的性能开销。