UE4 巡逻系统及AI感知组件
随机巡逻
首先创建AI行为树和黑板
自己进行命名
然后打开新建的黑板,在黑板中添加两个布尔(IsHearSomeNoise
、IsFindPlayer
)、一个向量(TargetLocation
)和一个对象(TargetActor
)。
然后打开AI的蓝图,在蓝图中拖出“事件开始运行”函数,拿出一个自身的引用,然后获得AI控制器,然后从AI控制器中拖出“运行行为树”函数。BTAsset
选择刚刚创建的行为树。
然后关闭AI蓝图,在内容浏览器创建一个蓝图,继承于BTTaskBlueprintBase
。
打开新建的任务,然后在函数一栏重写“接受执行”函数。
然后创建一个新的变量,将名字改为TargetLocation
,选为公有变量(点击变量旁边眼睛样的图案),变量类型选为黑板键选择器。
然后拖出变量,并从变量拖出函数“将黑板值设为向量”,从“事件接收执行”函数中的OwnerActor
拖出获取当前的位置,然后从返回值拖出获取可导航半径内的随机点,半径自己设置。然后将返回值连到函数“将黑板值设为向量”的参数中,然后完成函数的执行。
然后打开新建的行为树,将行为树右侧细节面板中的黑板资源设为新建的黑板。(一般默认设置为第一个)
然后从根组件拖出一个sequence
,然后拖出task
选择刚刚新建的任务,然后在任务的右侧细节面板处修改TargetLocation
的值,选择为黑板中的TargetLocation
(两个值不是同一个)。
拖出一个Move
和Wait
,Move
中的黑板值设为TargetLocation
,设置Wait
时间。
将AI蓝图拖到场景中,便可实现随机巡逻。
AI感知组件
回到内容浏览器,创建两个蓝图,继承于BTDecorator_BlueprintBase
(BT装饰器蓝图基础),分别用来判断AI是否发现玩家和AI是否听到声音
然后在AI蓝图里添加两个Bool变量IsFindPlayer
IsHearSomeNoise
。接着分别对两个蓝图实现功能。
IsHearSomeNoise
先创建一个变量,类型设置为黑板键选择器,并设为公有变量。
点击重写函数“执行条件检查AI”,先将ControlledPawn
转换成我们的AI蓝图,然后获取AI的布尔类型的值IsHearSomeNoise
,然后拖出黑板值IsHearSomeNoise
,然后拖出函数“将黑板值设为布尔”,然后对黑板值“按布尔获取”判断是否为真,将结果放到返回参数里。
IsFindPlayer
对IsFindPlayer蓝图也进行类似的处理,从而获取是否发现目标。
打开行为树,做成如下图所示
最右侧的MoveTo
的黑板值设为TargetActor
,其余MoveTo的黑板值均为TargetLocation
装饰器的添加在节点右键添加装饰器里
装饰器中,观察期中止选择Self
,当条件不成立时就不执行接下来的步骤。
翻转条件打上勾(这个参考你在装饰器中条件的判断,由于我写的时候是当为“真”的时候处理,所以需要bool
不成立时才执行下面的操作)。
打开AI蓝图,在“运行行为树”后执行“将值设为对象”,获取黑板中的创建的TargetActor
,将玩家Pawn设置进去。
在AI蓝图中给AI添加一个AI感知组件,然后分别创建视觉和听觉感知器官
我们可以对里面的参数进行修改
但注意的是,我们需要将按归属检测
这一栏中的所有选项都打勾。
然后打开玩家蓝图,给玩家添加一个AI感知刺激源组件
并添加听觉和视觉刺激源
然后再打开AI蓝图,们点击AI感应组件,可以看到官方提供的函数,然后点击函数“目标感知更新时”。
将被感知的物体转换成我们的玩家类,将AIStimulus
结构打开可以看到各种参数,比如Successfully Sensed
可以判断是否感知到物体。
运用这点去改变IsFindPlayer
的值,可以让AI去做相应的操作。
然后在场景中,AI便可以通过视觉发现目标后去跟踪目标。
调试的时候,按回车左边的 “ ’ ”键可以打开后台的调试,再按小键盘4可以查看AI感知组件的效果。
如果需要AI通过听觉去发现目标并去查看,我们可以通过动画通知去实现,在动画通知中调用函数“报告噪点事件”,AI便可以感知到。然后去修改AI蓝图中的“目标感知更新”中的内容即可。
(在后台调试中,红色球体代表听觉系统所感知的位置,绿色球体代表视觉系统所感知的位置)
尾言
据目前开发的经验来看,感知和听觉系统可以正常的发挥作用,但是我推荐将听觉触发和视觉触发分开来,比如:听觉刺激源可以放在一个Actor上,当他碰到场景的时候,就发出噪点,而视觉刺激源放在玩家身上。尽量避免将两个刺激源放在同一个物体上,如果放在一起,可能无法做到AI根据不同的刺激从而做出不同的操作。
或许存在着某种方法可以将两个刺激源放一起,且可以让AI做出不同的行为,如果有人有更好的建议,可以提出并修正!