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的单人版射击游戏,效 ...
随机推荐
- golang net/http包
http协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为 ...
- blender Text on Curve Text on Sphere
Text on Curve Shift + A 添加一个 BezierCurve Shift + A 添加一个 Text,Tab 编辑,再次 Tab 退回 Object Mode 选中 Text,Ad ...
- 人生重开模拟器「GitHub 热点速览 v.21.36」
作者:HelloGitHub-小鱼干 人生是不能重来的,但是 lifeRestart 能满足你的重开心愿.初始值不满意,你可以一直随机生成或者自动添加颜值.智力.运气值,倒是一种"重生&qu ...
- 【SpringMVC】完全注解配置SpringMVC
创建初始化类,代替web.xml 在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来 ...
- 经典多级时间轮定时器(C语言版)
经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...
- vue-router路由钩子
路由跳转前后,需要做某些操作,这时就可以使用路由钩子来监听路由的变化. 接收三个参数: to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: F ...
- 论文解读(PCL)《Prototypical Contrastive Learning of Unsupervised Representations》
论文标题:Prototypical Contrastive Learning of Unsupervised Representations 论文方向:图像领域,提出原型对比学习,效果远超MoCo和S ...
- windows 下使用 mingw编译器 调试时 无法跟进源码
windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...
- Java实现导入Excel文件
一.配置文件名称.路径.内容: <bean id="multipartResolver" class="org.springframework.web.multip ...
- httpd进程数统计,IP封禁,IP连接数量情况查看
ps -ef|grep httpd|wc -l 统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器. 查看Apache的并发请求数及其TCP连接状态:netstat -n | aw ...