UE4蓝图AI角色制作(六)之行为树
13、行为树原理
AI最重要的环节就是行为树。我们将解释什么是行为树、为何它如此重要,以及构建行为树需要哪些元素。
借助行为树,我们可以轻松控制并显示AI的决策制定过程。行为树是一种将AI在场景中的决策制定模型进行可视化的方法。通过观察行为树的可视化结构,我们可以清晰地了解行为树的执行方式和执行顺序,而不必了解每个节点的具体工作方式。行为树的执行顺序由行为树中各个节点的位置决定。
任务和合成可用于控制AI如何做出反应以及如何执行行为。任务节点:任务是行为树中的一种节点,它们下面无法再添加其他节点。它们是行为树分支的终点(但不是行为树的终点!)这使得它们还被称为叶节点。任务状态:任务拥有三种不同的状态:成功、失败或执行。无论任务成功还是失败,行为树都会接着执行下一个节点——在这一点上,行为树同样遵循从左到右的执行顺序。无论任务成功还是失败,行为树都会接着执行下一个节点——在这一点上,行为树同样遵循从左到右的执行顺序。
如果仅仅依靠任务节点,行为树能够实现的复杂程度还比较有限。这就需要用到合成节点了。合成是AI执行分支的根。它们不会像叶节点那样执行操作,但能创建一个结构,并能根据其子节点的成功或失败来控制顺序。
选择器合成节点会执行它下面的子节点。只要有子节点返回成功,那么它就是成功的。相反,如果所有子节点都返回失败,那么它就是失败的。你可以把它理解成它正在试图选择最合适的任务。由于行为树采用从左到右的执行顺序,我们可以把优先级最高的任务放在左边。想想看,如果你想打开一扇门,你可以用钥匙打开门,把锁撬开,或者破门而入。采用哪种方法并不重要,能达到目的即可。如果我们希望AI用钥匙开门而非破门而入,我们就应该把这个任务放在最左边。
序列合成节点会按照序列顺序遍历子节点,当且仅当所有子节点都成功执行后,它才会返回成功。如果某个步骤未能成功执行,它就会返回失败。这个节点的行为方式与人们处理障碍时的行为有点类似。
在很多情况下,我们需要按特定顺序执行,如果我们卡住了,就无法跳过这步执行下一步。比如打开一扇门。你需要打开门,穿过门,然后关上门。你不可能先穿过门,然后打开门,再关上门。
14、构建第一个行为树
为建立行为树,我们首先需要创建必要的资源,然后为AI控制器添加功能,以便自行运行行为树,最后创建第一个行为树分支,把此前创建的随机漫步逻辑替换成更灵活的模式。
我们先创建必要的资源,首先在“内容“>”ThirdPersonBP“>”蓝图”中新建一个目录,把它命名为”BT_Assets“,打开目录,然后右键点击内容浏览器,选择”AI“,然后选择”行为树“,将这个资源命名为”BT_EnenmyAI“,前缀”BT“表示这个资源是行为树。再次右键点击内容浏览器,选择”AI“,然后选择”黑板“,将这个资源命名为”BB_EnenmyAI “,下一步是确保我们的AI能够使用这个行为树。为此,我们需要打开AI控制器。在内容浏览器中,打开”蓝图“目录,打开”AIC_ThirdPersonCharacter“。右击点击事件图表,然后输入”event on possess“,拖动这个事件的执行引脚,然后输入”run behavior tree“,在”BTAsset“下拉菜单中选择新建的行为树资源,按F7编译。保存蓝图。

接下来,我们要确保将我们创建的黑板与行为树相关联,回到内容浏览器中的“BT_Assets“目录,打开”BT_EnenmyAI“,在细节面板中找到”AI“分段,确保选中黑板资源”BT_EnemyAI“。接下来我们需要在黑板的某个地方创建一个变量来保存目标位置,以便作为全新随机漫游逻辑中的AI的移动目的地。为此,我们新建一个黑板键,直接选中右框的”黑板“选项卡,在新建选项上选择向量类型的黑板键,将这个向量命名为”Target Location“。
下一步是新建一个任务,用于封装我们之前编写的所有随机漫游逻辑。和之前的版本一样,这个任务会以AI的当前位置为起点,找到一个可抵挡的有效位置。在“行为树“窗口中选择”新建任务”,然后选择“BTTask BlueprintBase”,这样就会新建一个任务并打开事件图表。在进一步之前,先回到内容浏览器的“BT_Assets“目录,将刚才创建的任务命名为“BTT_Find_Navigablelocation”,可以新建一个文件保存这个任务。
打开刚才新建的任务,新建一个事件叫做“Receive Execute AI”,当行为树尝试执行这个任务时,就会触发这个事件,为此,右键点击事件图表,然后输入“Event Receive Execute AI”.
在右键选择“get random reachable point in radius”函数。拖动“Event_Receive_Excute_AI”的“Controlled Pawn”引脚,然后输入“get actor location”,将“get actor location”的返回值连到“get random reachable point in radius”的“orgin”,将其半径设置为1000。

现在我们需要处理这个函数返回的随机位置参数。和之前的逻辑不同,一旦这个任务完成,它包含的所有信息都会被销毁。我们要做的是,把这个随机位置从任务传递给行为树,再传递给黑板。拖动“get random reachable point in radius”的“Romdom location”,然后输入“Set Blackboard Value as Vector”,注意,这个函数需要的第二条信息是一个向量值。拖动“key”键选择“提升为变量”,将这个新变量命名为“Target location key”.最后将“Event Receive Execute AI”的执行脚连到“Set Blackboard Value as Vector”的执行引脚。右键点击事件图表,然后输入“Finish Execute”,将“Set Blackboard Value as Vector”的执行引脚连到“Finish Execute” 的执行引脚,将“get random reachable point in radius”的”Return value”连到“Success”变量上,这意味着只要函数能够找到随机位置,这个任务就会被视作成功。

UE4蓝图AI角色制作(六)之行为树的更多相关文章
- UE4蓝图AI角色制作(四)之Gameplay调试器
8. 寻路网格体和Gameplay调试器 为了及时识别出AI系统中的导航问题,UE4提供了一个工具用来解决这类问题,它叫Gameplay调试器.打开项目设置,在左侧找到"引擎",然 ...
- UE4蓝图AI角色制作(三)
接上一节 6. 寻路网格体代理 通过允许配置多个"代理",虚幻引擎使得用户能够轻松为大小各异的AI创建寻路网格体.首先,选中世界大纲视图中的"RecastNavMesh& ...
- UE4蓝图AI角色制作(七)之追逐玩家
15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...
- 【摸鱼向】UE4的AI模块探索手记(1)
前言 之前实现了自主创作的角色导入进UE4并成功控制其进行一系列动作,但目前的样子距离基本的游戏架构还差了一个很大的模块:NPC,而这部分是由电脑来进行自动控制,所以,我有一句话不知当讲不当讲(对,我 ...
- UE4简单AI
首先做个小小的声明把,由于俺之前也没接触过AI ,所以有一些专业的词汇可能翻译存在各种问题,如果你发现的话,还是希望能够提出来哦,我们一起进步. 记住配合视频食用更佳哦~ 视频连接:http://ww ...
- UE4蓝图编程的第一步
认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色都在表示此处是什么类型的变量.对于初学者来说一开始看到那么多连接点, 可能会很茫然,搞不清还怎么连,如果知道了颜色 ...
- UE4的AI学习(2)——官方案例实例分析
官方给出的AI实例是实现一个跟随着玩家跑的AI,当玩家没有在AI视野里时,它会继续跑到最后看到玩家的地点,等待几秒后如果仍然看不到玩家,则跑回初始地点.官方的案例已经讲得比较详细,对于一些具体的函数调 ...
- [UE4]让AI跑起来
让AI由静止状态变成跑步状态,做法跟玩家角色走路一样. 一.创建1D混合动画 二.在AI角色关联的动画蓝图中使用第一步创建的混合动画
- UE4蓝图与C++交互——射击游戏中多武器系统的实现
回顾 学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...
随机推荐
- 浅谈可持久化Trie与线段树的原理以及实现(带图)
浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...
- Python - 面向对象编程 - 新式类和旧式类
object object 是 Python 为所有对象提供的父类,默认提供一些内置的属性.方法:可以使用 dir 方法查看 新式类 以 object 为父类的类,推荐使用 在 Python 3.x ...
- 20210805 noip31
考场 没有一眼题 T1 想到先贪心地算出最大得分,任意构造出一种方案,不断调整以增大字典序. T2 发现在 \(x_k\) 确定的情况下操作次数就是左右两边的逆序对数,\(x_i\) 互不相同时直接找 ...
- Linux高级之语句表达式
表达式 表达式和语句是 C 语言中的基础概念.什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子.操作符可以是 C 语言标准规定的各种算术运算符.逻辑运算符.赋值运算符.比较运算符等.操作数可 ...
- vue项目 'node-sass'问题
Cannot find module 'node-sass' 解决办法: 运行命令:cnpm install node-sass@latest 即可解决,( 网络差的同学可以选择重新下载no-modu ...
- Python增强下git那长长的指令
场景 现如今有点规模的公司都使用GitFlow模式进行分支管理.虽然插件给我们带来了非常大的方便,但切换分支.找分支.起分支还是那么的麻烦 需求 在社会主次国家,每个生活在底层的劳动人民,他们默默的工 ...
- 从输入 URL 到展现页面的全过程
总体分为以下几个过程 DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 DNS解析 域名到ip地址转换 TCP连接 HTTP连接是基于TCP连接 ...
- Android仿QQ空间发表动态
效果展示图: 功能描述:用户点击+会进入发表动态的界面,发表成功后跳转到个人首页. 后续完善:增加个人头像的上传,对界面进行优化,增加点赞和评论的功能. 主要采用listview对内容进行展示,对sq ...
- java的运行时数据区域
最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 1.程 ...
- spring Data Jpa的依赖+配置
spring data jpa 是spring基于的orm框架,jpa规范的基础上封装的一套JPA应用框架 添加的相关依赖: <properties> <spring.version ...