一、一般静态障碍物
如box、wall、tower等障碍物,可以设置成prefab,在运行时自动加载;
- 在节点下新建一节点,如node ;
- 将脚本obstacleCtrl挂载到node节点上;
- 确定碰撞区数量:box、poly的数量;这个boxcollider只是为了编辑界面进行显示,正式运行时无效。
- 编辑各个碰撞区边界;
- 保存场景,在程序正式运行时,会自动识别静态障碍物边界,并删除collider组件。
二、地图上限制通过的障碍区域
可将地图节点设置为预制体,动态加载。
-
在地图节点下新建一节点,如node ;
-
将脚本obstacleCtrl挂载到node节点上;
-
确定碰撞区数量:box、poly的数量;这个boxcollider只是为了编辑界面进行显示,正式运行时无效。
-
编辑各个碰撞区边界,;
-
保存场景,在程序正式运行时,会自动识别静态障碍物边界,并删除collider组件。
三、移动避障体
- 在需要移动避障的节点actor下,新建一个名为“agent”的空子节点;
- 在agent上挂载AgentCtrl脚本;
- 设置移动避障体的参数:主要是半径、最大速度、 查找邻居距离、最大邻居数量 ;
- 查找邻居距离,不小于两个碰撞体的半径和;
- 最大邻居数量,建议不小于被包围的节点的数量;
- 在actor上,新建一个脚本组件actorCtrl;
- actorCtrl继承NodeCtrl基类组件;
- 在actorCtrl里实现setPrefV方法即可;
setPrefV,设置actor不需要避障时的默认移动速度。
四、TiledMap地图上自动识别障碍物层
- 在TiledMap节点(如tMap)上挂载ObstacleCtrl脚本
- 在设置里加载tMap节点;
- 输入障碍物层的层数
- 输入障碍物层名字的字符串
- 指定TiledMap的实际缩放比例scale
五、运行ORCA
- 在场景的Canvas下新建空子节点,如orca;
- 在orca子节点上挂载ORCACtrl脚本;
- 可选择调试、防抖动等设置;
- 程序运行中,即可自动识别动静态障碍物进行避障。
六、流场寻路算法
ORCA避障,当有障碍物夹在目标与行动节点之间时,很多情况下会卡滞。此时需要寻路算法进行自主寻路。 对群体节点而言,流场寻路算法简单有效。
- 流场寻路算法对斜方向运动目标,有可能在静态障碍物顶点处发生卡滞,本算法加入了障碍物膨胀算法,可使运动节点平滑转向;
- 流场寻路算法主要在FlowField文件夹下的脚本,FlowFieldMgr文件用单例实现了流场算法及debug,RayCastingPolygonDetection文件是射线法点-in-多边形检测,脚本都加注了大量说明,方便理解;
- 游戏主脚本GameCtrl中的start中引入初始化,update引入流场寻路算法,每帧根据目标点是否移动进行更新;
- monster在每帧的setPrefV方法中,自动生成寻路方向。
- FlowFieldMgr中加入了debug功能,在场景中可勾选是否打开debug模式,可方便显示流场各个位置的方向、权重等信息, 打开debug时会严重卡滞, 关掉即可。
七、备注
- 上述动静态障碍物、TiledMap节点都可设置为预制体,支持动态加载;
- 支持程序中动态删除,删除时直接删除节点即可,障碍体会自动删除;
- 为确保识别准确,动态障碍物的缩放,不会影响半径等属性,需要手动设置这些属性。
八、商城链接
https://store.cocos.com/app/detail/8193
开发不易,谢谢支持!









