这是最近公司提的一个需求,调研移动的平台上AI寻路的可行性
对Ue的AI寻路了解的,应该会体会到这个需求的困难:

存在的问题:

  1. 平台会移动,但导航数据还在原地,导致原来的导航失效
  2. 更新平台导航时的效率问题:因为本质上平台的地形完全没有发生变化,只是在位移罢了,但动态更新导航不可避免重新进行体素化,并重新构建导航,费的让人看不懂。
  3. 先完全抛开前面两个问题不管,我的导航就是能跟着平台一起走,而且一点也不费:这时,你在AI开始寻路的时候你会发现,你寻路结果得到的点一直在往后走(其实是平台在往前走,但寻路结果不会变),你的机器人移动变得开始诡异:

    1. 各种撞墙,路都不会走了。
    2. 大多数机器人用不了多久时间会集中平台的尾部,感兴趣的可以试试,我替大家试过了。
      (原因也很简单,以后终点会在平台移动过程中向后靠,所以靠后的点数量明显会变多)

解决这些问题时会遇到的问题:

  1. 策划要求:移动平台有多个甚至还能合体(没办法给你固定平台,移动场景取巧的)
  2. Ue的导航信息记录在NavData里,里面是定死了坐标的。导航系统还有一堆八叉树,体素信息记录了NavData的相关数据(总而言之就是:你要平移导航数据很麻烦,牵扯到的东西又多又杂)
  3. 直接开启实时更新动态导航:光是正常的地形变化的消耗都特别大了,别说整个地形移动了,:(
  4. 寻路结果更新:这块可能好点吧,也就是重写AI控制器,重写Moveto的Task,重写Pathfollowing逻辑,给每一块都加上一个平台移动的偏移量,一点都不麻烦,:(

初期尝试解决:

最开始,我对实时更新导航还是没死心,毕竟这个方法最简单了,如果搞的好我就不用折腾底层代码了。
先测测关闭更新导航时的游戏帧数吧:(稳定75帧左右)
于是结合百度,谷歌,UE官方和源码,自己脑补得出了3种方法:

  1. 直接动态更新整个地图的导航
    不优化就是最大的优化!我就是要试一下能多费:(4帧左右,打扰了!)
  2. 分多个NavMeshBounds,并实时更新其位置
    这个优化,其实就是把导航体积搞小了,再怎么更新我台子就这么大:(14帧)
    好像快了一点,4帧能玩,14帧流电竞!(不是)
  3. 使用NavigationInvoker(Ue提供的actor组件:在actor周围实时生成并更新导航):
    其实看到这个工具的视频里的应用场景其实也只是在静态的平地加在actor身上的,我的评价是我刚好能用省得我写很多代码,但感觉效率可能和上面那个差不多:确实差不多,(平均在15~16帧左右)。

​和上级反馈完以后基本上这条路就差不多到点了,要想想别的办法,:(
​而且这才第一个问题,AI寻路结果都还没改呢。

最终方案:

下午去吃饭的路上突然想到的,事实证明人就不应该一直待工位上,多走走人都聪明点。
那么具体是什么方案?
首先肯定不能动态更新导航了,那怎么寻路?
现在效果差不多如图下所示,绿色的是导航数据,平台已经移动到左边了(不要问为什么椅子这么大)

机器人在左边,因为没有踩导航数据所以不能寻路。
那假如他在右边不就能寻路了嘛!
他等效在右边的什么位置上,我们可以用平台偏移算出来,那能获得导航数据对应的点,寻路的问题就解决了。
开码!
(红色的线是我画的,其实debug时是画了蓝色的线的,但看不太清楚。编码一路上一帆风顺甚至编译都没报错,可能这就是ACMer的码力吧,所以剩下时间拿来画图了)

OK,寻路的问题解决了,那我再把寻路结果转移到当前平台上,就能得到现在平台上的寻路结果了不是嘛。

完美!
看看到目前位置我们解决了哪些问题:

  1. 平台移动不能导航的问题(Finish)
  2. 导航更新的效率问题(OK,现在更都不用更了,Finish)
  3. 寻路结果需要更新(确实,光是这样还不能解决最后一个问题,寻路的点会向后偏移)
    其实,我在写的时候已经把最后一个问题解决了,只是为了说清楚思路没提前讲。细心的同学可能已经发现了,上图的绿色点间都有白色的细线,这个是UE提供的SplineComponent,以前我做过NPC沿样条组件移动,那么用它有什么好处呢?

    1. 控制移动:我可以通过距离得到机器人对应到样条的那一帧的移动方向,每帧给它加移动输入就好了,我就不用反复调多个task来实现多个点的移动了。
    2. 平滑移动:曲线的自定义空间更大,拐弯处的转向也没那么生硬。
    3. 解决寻路更新问题:这个SplineComponent我是attach在平台的RootComponent上的,所以平台移动时,它也会跟着平台移动,也就不用我去实时给寻路结果加偏移了
      到此为止,基本上所有问题就解决了。

当然,这种方法核心还是在规避而不是在解决,没有导航网格还是会遇到以下问题:

  1. 机器人无法使用NavLink
  2. 人群AI避障无法使用Crowd系统,只能用ROV物理来避障,但据我了解,ROV做的有点拉,效果不尽人意

结束!

随便聊聊

最近500米买了个露比的生日手办,好好看。(摄影技术略烂,以后再好好拍几张)
手办.jpg
​这一段时间心情都不是很好,工作上有点动荡,不知道怎么做前景才会更光亮一点,想成为一个追求技术的Geek但最近又有点静不下心,看了很多视频学到的缺甚少,现在都不知道想学啥了,处于不想摆烂却在摆烂的阶段,这么下去不知道以后还能不能做爆款,: )

​游戏最近也打腻了,回家以后都没什么想干的,感觉好亏啊。即没玩到,又没学到,属于纯浪费时间了,之后得找点事做。
​就这样,: )

最后修改:2023 年 09 月 26 日
如果觉得我的文章对你有用,请随意赞赏