ORCA避障算法+流场寻路组件使用说明

一、一般静态障碍物

   如box、wall、tower等障碍物,可以设置成prefab,在运行时自动加载;
  1. 在节点下新建一节点,如node ;
  2. 将脚本obstacleCtrl挂载到node节点上;
  3. 确定碰撞区数量:box、poly的数量;这个boxcollider只是为了编辑界面进行显示,正式运行时无效。
  4. 编辑各个碰撞区边界;
  5. 保存场景,在程序正式运行时,会自动识别静态障碍物边界,并删除collider组件。

二、地图上限制通过的障碍区域

可将地图节点设置为预制体,动态加载。
  1. 在地图节点下新建一节点,如node ;

  2. 将脚本obstacleCtrl挂载到node节点上;

  3. 确定碰撞区数量:box、poly的数量;这个boxcollider只是为了编辑界面进行显示,正式运行时无效。

  4. 编辑各个碰撞区边界,;

  5. 保存场景,在程序正式运行时,会自动识别静态障碍物边界,并删除collider组件。

三、移动避障体

  1. 在需要移动避障的节点actor下,新建一个名为“agent”的空子节点;
  2. 在agent上挂载AgentCtrl脚本;
  3. 设置移动避障体的参数:主要是半径、最大速度、 查找邻居距离、最大邻居数量
  • 查找邻居距离,不小于两个碰撞体的半径和;
  • 最大邻居数量,建议不小于被包围的节点的数量;
  1. 在actor上,新建一个脚本组件actorCtrl;
  2. actorCtrl继承NodeCtrl基类组件;
  3. 在actorCtrl里实现setPrefV方法即可;
    setPrefV,设置actor不需要避障时的默认移动速度。

四、TiledMap地图上自动识别障碍物层

  1. 在TiledMap节点(如tMap)上挂载ObstacleCtrl脚本
  2. 在设置里加载tMap节点;
  3. 输入障碍物层的层数
  4. 输入障碍物层名字的字符串
  5. 指定TiledMap的实际缩放比例scale

五、运行ORCA

  1. 在场景的Canvas下新建空子节点,如orca;
  2. 在orca子节点上挂载ORCACtrl脚本;
  3. 可选择调试、防抖动等设置;
  4. 程序运行中,即可自动识别动静态障碍物进行避障。

六、流场寻路算法

ORCA避障,当有障碍物夹在目标与行动节点之间时,很多情况下会卡滞。此时需要寻路算法进行自主寻路。 对群体节点而言,流场寻路算法简单有效。

  1. 流场寻路算法对斜方向运动目标,有可能在静态障碍物顶点处发生卡滞,本算法加入了障碍物膨胀算法,可使运动节点平滑转向;
  2. 流场寻路算法主要在FlowField文件夹下的脚本,FlowFieldMgr文件用单例实现了流场算法及debug,RayCastingPolygonDetection文件是射线法点-in-多边形检测,脚本都加注了大量说明,方便理解;
  3. 游戏主脚本GameCtrl中的start中引入初始化,update引入流场寻路算法,每帧根据目标点是否移动进行更新;
  4. monster在每帧的setPrefV方法中,自动生成寻路方向。
  5. FlowFieldMgr中加入了debug功能,在场景中可勾选是否打开debug模式,可方便显示流场各个位置的方向、权重等信息, 打开debug时会严重卡滞, 关掉即可。

七、备注

  1. 上述动静态障碍物、TiledMap节点都可设置为预制体,支持动态加载;
  2. 支持程序中动态删除,删除时直接删除节点即可,障碍体会自动删除;
  3. 为确保识别准确,动态障碍物的缩放,不会影响半径等属性,需要手动设置这些属性。

八、商城链接

https://store.cocos.com/app/detail/8193
开发不易,谢谢支持!

没有链接 :thinking:

https://store.cocos.com/app/detail/8193
谢谢支持