本文介绍如何实时检测里AI最近的角色。
检测所有感知范围内的actor

在AIcontroller蓝图里添加一个AI感知组件,设置好感官配置。添加事件OnTargetPerceptionUpdated,然后break Stimulus。要先判断是进入时感知还是离开时感知,如果actor进入范围值为true,actor离开范围值为false。当actor进入时,我们根据actor是否有无标签来判断这个actor是否为我们的目标actor。如果是的话把它添加进我们的actor数值。然后设置黑板值来进行行为树事件的切换。
如果actor离开了范围,直接把它从数值中移除,接下来判断数值是否为空,如果为空则设置黑板值切换行为树事件,然后将目标设置为空(因为感知范围内里已经没有目标actor了)。这样这个数值里面所有的actor都是在范围内的被设置过标签的actor。但有一种情况例外,如果符合条件的actor直接在感知范围被被销毁那么它仍然会在数组里。
确定最近的actor

因为要实现确定所有这个逻辑需要写在EventTick后面。首先判断数值是否为空,如果为空则不进行后面的逻辑。因为每帧都要执行,所以用do once节点,当整个逻辑执行完之后再reset,防止出错。接下来遍历数组,先判断actor是否存在。如果不存在,则移除这个actor,再将距离变量重新设置,结束本帧的逻辑。如果存在,接下来分别获取AI自身与这个actor的位置,计算距离。如果距离变量此时的值为0,则就直接将这个距离赋予给这个变量,将黑板的目标设置为这个actor。如果不是0,就需要比大小,只有小于此距离的才将黑板的目标设置这个actor,同时把这个actor的距离设置给距离函数,用于下一个actor的比较。遍历完成之后,黑板的目标就是距离AI最近的actor。最后遍历结束后重新设置距离变量,reset doonce。
这样就实现了实时检测距离AI最近的目标actor。