[程式] Unreal Avoidance系统(上)

楼主: yekdniw (yekdniw)   2018-02-10 23:35:24
网页版
https://yekdniwunrealengine.blogspot.tw/2018/02/unreal-avoidance_10.html
AI角色在移动时,为了能够闪开场景的物件,大致上可分为静态物件与动态物件两种。
静态场景的物件能够透过Collision+CanAffectNavigation设定或是在场景内
种Navi Modifier Volume将Navigation Mesh挖空,让AI没办法走在这些物件上;
而动态物件的闪避(闪避其他角色)则利用Avoidance闪避系统来处理。
Unreal Engine里面有两种avoidance系统可以选择性地使用,
其中一个是RVO,另一种则是Detour crowd simulation。
然而根据
https://wiki.unrealengine.com/Unreal_Engine_AI_Tutorial_-_2_-_Avoidance
所提到的,Unreal提供的RVO不保证在推挤或闪避的过程中,
角色依然能维持在Navigation mesh上,这代表有可能你的角色会发生
卡在场景内走不出来的现象...
(我也不知道为什么这样子的东西能放在上面给人使用)。
因为这样的原因,在蒐集一些资料后我直接选择Detour使用,
RVO就直接被我跳过不用了。所以本篇会着重在Detour crowd simulation系统上说明。
除此之外,一般网络搜寻到的文章也会建议RVO与Detour不要同时打开,
以免产生冲突的行为。
RVO与Detour的差异
开始详细介绍Detour之前,先比较一下RVO跟Detour两个系统的差别。
Table 1. 比较RVO与Detour系统的差异。
RVO Detour
使用难易度 简单 普通
可调整参数 少 超多
可改写的行为 不确定 很多但麻烦(只能C++)
缺点 不保证在NavMesh上 复杂的计算与设定
使用的难易度:RVO 比 Detour容易。 RVO开启非常简单,更改设定也很简单。
也允许blueprint(BP)端执行期间更改回避的设定;
Detour就相对麻烦了,如果只是要开启一些很简单的效果,使用难度跟RVO差不多,
但是只支援BP事先定义好的回避参数,想要在实际执行过程中改变
回避设定的话有很多事情要处理,而且都是要在C++端实作才行。
可调整参数:RVO能调整的似乎就是回避半径,回避比重,自己所属的回避Group,
要回避的Group,要无视的Group这几种参数;
Detour除了上述几个参数以外,还有超级多的参数可以设定,
这些设定都在Edit->Project Settings->Crowd Manager内,后续会再作说明。
有关可改写的行为:虽然我这次使用也没有改写Detour行为的部份,
但是Detour的程式码几个重要的函式都有开成Virtual function(虚拟函式)的,
所以如果有想要改写是有机会的。
RVO的部份我没有深入研究就直接列为不确定了。
缺点的话:RVO的问题在前面提到了,Detour的话直接在程式码的注解就注明
会需要大量计算,而且默认可支援的Agent(同时可闪避的动态单位)数量是设为50,
超过就要改参数设定。
如何选择要使用RVO还是Detour
所以如何选择要使用RVO还是Detour?如果你是纯BP专案,
而且满足下面两个条件其中一项:
1.需要执行时期能改变回避对象
(例如AI角色需要某些时候会回避其他AI角色、某些时候却不会)
2.你需要回避玩家。
那你没有选择,只能使用RVO,直接打消使用Detour的念头吧!
开启RVO回避或Detour回避
要开启RVO回避的步骤如下(参考Figure1.):
1. 打开AI Character/Pawn的BP,选取CharacterMovement component。
2. 找寻Avoidance的分类,把Use RVOAvoidance打勾
3. 设定Avoidance Group / Groups to Avoid / Groups to Ignore 三个最重要的参数
举例来说,这个AI角色的人可能要互相回避,也要回避玩家,
那么可以设定玩家的AvoidanceGroup是0,AI角色的AvoidanceGroup是1,
然后AI角色的Group to Avoid的0跟1都打勾。
[图1]
Figure 1. 在CharacterMovement内设定RVO。
RVO也能支援BP执行期间更改Avoidance开关以及Group设定,可参考下图四个函式:
[图2]
Figure 2. RVO可供执行期间变更设定的函式。
使用上面的函式组合,代表你可以在执行过程中根据条件回避玩家或不回避。
要开启Detour回避的步骤如下:
1. 打开你的AI Controller BP,Class Settings->Parent Class从
AIController改成Detour Crowd AIController。
2. 打开你的AI Character/Pawn的BP,选取CharacterMovement component。
3. 确认Use RVOAvoidance是false
4. 设定Avoidance Group / Groups to Avoid / Groups to Ignore
执行之后,Detour就会自动开启,并照着你设定的Group作回避了。
注意!
虽然Detour跟RVO都是共用Avoidance Group / Groups to Avoid / Groups to Ignore
的设定,但是Detour只有Class Default内的设定是有效的,
想要在Detour运作的状态下使用Figure2.图中列出来的函式都是没作用的。
包含执行期间关闭AI角色的回避或改变AI回避的对象。
如果要能够支援执行期间修改,必须要从C++的部份下手,
如何进一步修改相关的设定将在下一篇文章说明。
作者: damody (天亮damody)   2018-02-10 23:53:00
作者: rhox (天生反骨)   2018-02-11 00:16:00
push
作者: coolrobin (泳圈)   2018-02-11 00:51:00
推 最近也研究了UE的AI部份,不过还没看到这块,赞!
作者: laikyo (六元)   2018-02-12 08:59:00
有用
作者: elfkiller (没有暱称)   2018-02-12 21:43:00
这篇很棒 推
作者: wangm4a1 (水兵)   2018-02-14 13:56:00
作者: SaxPenguin (平果)   2018-02-14 14:45:00
Detour也可以回避玩家啦(要改Code)
楼主: yekdniw (yekdniw)   2018-02-14 19:22:00
hmm..文中有提到是纯BP的话Detour不能回避玩家不是Detour不能回避玩家哦~改了code的话我想就不算纯BP专案了~
作者: rickkcir (多果汁)   2018-02-18 13:49:00
篇这推
作者: Cypher00100 (FERZE)   2018-02-18 14:08:00

Links booklink

Contact Us: admin [ a t ] ucptt.com