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的单人版射击游戏,效 ...
随机推荐
- JVM双亲委派模型及其优点
JVM双亲委派模型及其优点 什么是双亲委派模型? 双亲委派模型: 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器, ...
- 【曹工杂谈】Maven源码调试工程搭建
Maven源码调试工程搭建 思路 我们前面的文章<[曹工杂谈]Maven和Tomcat能有啥联系呢,都穿打补丁的衣服吗>分析了Maven大体的执行阶段,主要包括三个阶段: 启动类阶段,负责 ...
- 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...
- Tensorflow保存神经网络参数有妙招:Saver和Restore
摘要:这篇文章将讲解TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的神经网络. 本文分享自华为云社区<[Python人工智能] 十一. ...
- es查询--请求body
查询的JSON结构 普通查询 { "query": { # 查询条件 "match_all": {} //匹配所有文档, 所有 _score 为1.0 # &q ...
- c# 扩展方法奇思妙用基础篇九:Expression 扩展
http://www.cnblogs.com/ldp615/archive/2011/09/15/expression-extension-methods.html .net 中创建 Expressi ...
- 逐条更新数据 sql
declare @tid int declare @fid int declare @i int declare @j int set @j=(select count(*) from ...
- vue-cli3项目中使用vue-ueditor-wrap
Vue + UEditor + v-model 双向绑定 一.安装 1 npm i vue-ueditor-wrap 2 # 或者 3 yarn add vue-ueditor-wrap 二.下载文件 ...
- liunx常见指令
linux目录结构 bin:存储普通命令 sbin:存储超级命令 home:存储普通用户 root:存储超级用户 usr /usr/local:下存储数据或软件,通常软件都放在其中 tmp:临时目录 ...
- 论文解读(DGI)《DEEP GRAPH INFOMAX》
论文标题:DEEP GRAPH INFOMAX 论文方向:图像领域 论文来源:2019 ICLR 论文链接:https://arxiv.org/abs/1809.10341 论文代码:https:// ...