虚幻五中的AI行为树笔记,实现AI的“巡逻”

YYYYYY02020 2024-07-28 10:31:01 阅读 77

简述虚幻五中行为树的使用方法和一些理解

这边要实现的功能是,AI未见玩家时,巡逻,AI看见玩家时,跑向玩家并挥拳攻击

ai_bp:一个actor的蓝图类,自己命名的,用于AI的行为的执行

行为树:记录AI执行逻辑,行为

黑板:存储信息,一些变量等

AIcontroller(第四个,没改名):控制器,进行AI的总控制

 首先在黑板中创建需要的变量,第二个是布尔值,第三个是一个矢量

  

 然后,为了能让AI能够智能地检测到玩家等,需要在AI控制器中添加AI感知组件

然后给AI获得视力配置,在细节面板点击加号,获得视力配置,在sence里面视线半径就是能够感知地距离,次要视觉半角角度,就是,AI的视角,按归属检测,添加检测中立方,可以看到玩家,这边这个感知组件可以返回感知到的信息

为了获得感知到的信息, 我们为其添加一个事件

目标感知更新时:可以说是帧更新的,不断返回信息,actor,所返回的感知到的对象;stimulus,刺激物,包含一些感知的信息

这里,我们进行类型类型转换,这里的意思是,只有当感知到的对象是玩家时,才会进行下一步,

break aistimulus:里面包含的是感知到的信息,其中 successfully sensed是一个布尔值,判断是否看到刺激物

(需要理解与提及的是,我们调出这个thirdpersoncharacter中的object,是我们需要给这个空所进行传的值,文章末尾会再细说一下)

然后,我们在行为树里,写下AI的程序逻辑

root:根部,简单理解为树的发源地

下面会引起三个类型的任务或行为:selector,选择性任务,两件事选其一进行;sequence,顺序执行的任务,按顺序执行;simple parallel:以后说,还不太会

然后选择要用的黑板,使用里面存的信息

根据我们需要实现的逻辑,我们需要看到玩家执行一条逻辑,没看到玩家执行另一条逻辑,然后,为了进行selector,我们需要添加黑板

然后要在黑板里面找到自己创建的是否看到玩家的布尔值,观察器终止也保持both(设置优先级,保持同一级),确保二者同时进行

然后,我们需要把我们的AI感知组件中成功看到玩家的布尔值传给黑板,以便成功进行行为树任务

这里,进行设置一个布尔值,下面传入成功看到玩家的布尔值,target接获取黑板,将黑板中的布尔值传入,这里肯定只会有一个黑板所以直接获取,然后key name就是我们需要传入的那个布尔值的名字

然后我们来创建一个AI行为树的任务,AI会进行一个任务,改名随机找点,当AI看不到玩家时会随机移动

然后,在这个任务的图表中

在函数重载可以找到event receive execute AI

event receive execute AI:执行开始,返回被操控的AI

成功移动到该点之后,finish execute,完成任务,进行下一个任务 

然后在行为树中写下这个任务,添加一个wait,停留5s之后再进行随机找点

然后,让我们的AIcontroller与我们的行为树建立一个联系,再事件开始运行时,执行一个行为树

同时,我们也需要让我们的AI和我们的AIcontroller进行联系,AI控制器类中,选择我们的控制器

同理,我们来创建一个看到玩家会做的寻找玩家的任务,新建一个任务,然后写下以下节点

在行为树中添加上这个任务

然后,为了能使AI不断朝向我们的玩家,我们在这寻找玩家任务中添加一些节点 

首先,在AI中找到将旋转朝向运动置空,在pawn中将使用控制器旋转Yaw打勾,这两个都会影响我们的角色朝向,那么我们需要用控制器来控制AI的朝向,就把使用控制器控制Yaw打勾

 

然后我们在任务中添加节点,来使AI朝向我们的玩家

setfocus:设置焦距,target是设置焦距面向的对象,也可以理解为影响的组件,就是我们的AIcontroller,newfocus就是我们需要朝向的对象

 

为了让我们的AI实现失去玩家目标之后,不至于还朝向我们,我们需要在另一个任务中,清除焦距

 

那么我们大概可以完成这些功能,实现巡逻,和跑向玩家的任务,然后我们来实现靠近玩家打拳的效果,这里我们没有打拳的蒙太奇动画,就随便创建一个

这边蒙太奇是一种剪辑手法,可以将许多动画资产剪到一起去

然后,我们在AI蓝图中创建一个球体碰撞触发器,添加碰撞和离开的事件,并进行类型转换

 

然后,我们要做的是,让AI靠近玩家然后播放蒙太奇

montage play:蒙太奇播放,选择我们要播放的蒙太奇,目标是我们的人物实例

set timer by event:根据事件的定时器,定时调用一个事件,可以循环

loop:自定义事件,定时器不断走这一条路,然后就会不断播放打拳的动作

 

然后,我们离开玩家时,需要停止这个loop

定时器中的return value,可以返回定时器的值,对定时器进行设置,离开时,将定时器清除即可

clear and invalidate timer by handle:以句柄清除定时器并使之无效

 然后我们需要在蓝图类中插入一个插槽,才能让这个蒙太奇能够播放

找到我们的蒙太奇,然后点开右上角的manny

点开左边面板中的动画图表,加上一个插槽才能用

插槽可以理解为一种分类,区分出我们需要播放哪一个蒙太奇,更加智能

 

同时,我们可以修改一下AI碰撞中的预设,使其无法遮挡到我们的摄像机,将camera改成忽略

完成,最后,补充一点笔记

白色——————————执行线,表示程序的执行流程

红色——————————BOOL变量

洋红——————————字符串变量

粉色——————————文本

橙色——————————Transform偏移矩阵

金色——————————Vector矢量

绿色——————————Float浮点型变量

青色——————————Integer整型变量

蓝色——————————object对象

紫色——————————旋转体数据

还有,类和实例:

类,就相当于一个模板,将某物进行分解之后,每一部分都可以进行输入参数这样的操作,使其从模板,变成一个具体的实例,我们蓝图中的操作许多都是面向类,对类进行操作之后,其实并没有对哪个实例进行操作,因此,当我们的操作没有对应的实例时,我们的类就是没有意义的,空的,所以需要对其进行赋值传参,把具体的需要进行操作的对象传进去,所以上文,才会需要将self传入,不然没有具体操作的对象(这只是我的一浅显的理解)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。