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角色制作(六)之行为树的更多相关文章

  1. UE4蓝图AI角色制作(四)之Gameplay调试器

    8. 寻路网格体和Gameplay调试器 为了及时识别出AI系统中的导航问题,UE4提供了一个工具用来解决这类问题,它叫Gameplay调试器.打开项目设置,在左侧找到"引擎",然 ...

  2. UE4蓝图AI角色制作(三)

    接上一节 6. 寻路网格体代理 通过允许配置多个"代理",虚幻引擎使得用户能够轻松为大小各异的AI创建寻路网格体.首先,选中世界大纲视图中的"RecastNavMesh& ...

  3. UE4蓝图AI角色制作(七)之追逐玩家

    15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...

  4. 【摸鱼向】UE4的AI模块探索手记(1)

    前言 之前实现了自主创作的角色导入进UE4并成功控制其进行一系列动作,但目前的样子距离基本的游戏架构还差了一个很大的模块:NPC,而这部分是由电脑来进行自动控制,所以,我有一句话不知当讲不当讲(对,我 ...

  5. UE4简单AI

    首先做个小小的声明把,由于俺之前也没接触过AI ,所以有一些专业的词汇可能翻译存在各种问题,如果你发现的话,还是希望能够提出来哦,我们一起进步. 记住配合视频食用更佳哦~ 视频连接:http://ww ...

  6. UE4蓝图编程的第一步

    认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色都在表示此处是什么类型的变量.对于初学者来说一开始看到那么多连接点, 可能会很茫然,搞不清还怎么连,如果知道了颜色 ...

  7. UE4的AI学习(2)——官方案例实例分析

    官方给出的AI实例是实现一个跟随着玩家跑的AI,当玩家没有在AI视野里时,它会继续跑到最后看到玩家的地点,等待几秒后如果仍然看不到玩家,则跑回初始地点.官方的案例已经讲得比较详细,对于一些具体的函数调 ...

  8. [UE4]让AI跑起来

    让AI由静止状态变成跑步状态,做法跟玩家角色走路一样. 一.创建1D混合动画 二.在AI角色关联的动画蓝图中使用第一步创建的混合动画

  9. UE4蓝图与C++交互——射击游戏中多武器系统的实现

    回顾   学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...

随机推荐

  1. GUI容器之Panel

    Panel //panel可以看成是一个空间,但不能单独存在 public class MyPanel { public static void main(String[] args) { Frame ...

  2. JS 处理图片平铺问题

    background: url("../../../assets/image/center.png") no-repeat; // 让图片不平铺   overflow: hidde ...

  3. SSH整合(二)

    SSH框架实现登录.新闻增删改查.树形菜单 项目结构 pom.xml 网不好不要一次引入太多,容易下不全 <project xmlns="http://maven.apache.org ...

  4. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. docker run配置参数

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...

  6. go语言游戏服务端开发(三)——服务机制

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...

  7. qsc oj-17 喵哈哈村的排队

    http://qscoj.cn/problem/17/ 喵哈哈村的排队 描述 有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为1的村民站在最后面,标号为n的村民站在队列的最前面,而且每个 ...

  8. .NET 中的HTTP 3支持

    dotnet团队官方博客发布了一篇HTTP3的文章:HTTP/3 support in .NET 6.文章介绍了.NET 6 将预览支持HTTP3,.NET 7正式支持HTTP3,原因主要是HTTP/ ...

  9. 使用metaweblog API实现通用博客发布 之 版本控制

    使用metaweblog API实现通用博客发布 之 版本控制 接上一篇本地图片自动上传以及替换路径,继续解决使用API发布博客的版本控制问题. 当本地文档修订更新以后,如何发现版本更新,并自动发布到 ...

  10. http请求在https中使用

    问题原因:HTTPS页面里动态的引入HTTP资源,比如引入一个js文件,会被直接block掉的.在HTTPS页面里通过AJAX的方式请求HTTP资源,也会被直接block掉的. 解决方案: <m ...