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. vue ele table表格 设置只能勾选一个

    table 更改属性设置: <el-table ref="multipleTable" :data="tableData" tooltip-effect= ...

  2. (一)羽夏看C语言——简述

    "羽夏看C语言"介绍什么   本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...

  3. SSH无法正常连接服务器

    远程权限没有打开 #允许root登录 PermitRootLogin yes #不允许空密码登录 PermitEmptyPasswords no 远端的ssh信息有变化,本地保存的那个需要删掉 Use ...

  4. mybatis动态sql以及分页

    1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 &l ...

  5. python实现遥感图像阈值分割

    1.阈值分割 import os import cv2 import numpy as np import matplotlib.pyplot as plt from osgeo import gda ...

  6. TCL、华星光电和中环股份,如何在一条生态链上领跑?

    聚众智.汇众力.采众长. "我们决心用五年时间,将TCL科技和TCL实业做到真正的世界500强,将智能终端.半导体显示.半导体光伏三大核心产业力争做到全球领先,将半导体材料等其他产业做到中国 ...

  7. tar解压缩问题

    gzip: stdin: unexpected end of filetar: 归档文件中异常的 EOFtar: 归档文件中异常的 EOFtar: Error is not recoverable: ...

  8. vue中的watch

    1.第一种 watch:{ total:{ // total:要检测的数据   handler:(val,oldVal)=>{ // handler方法自动执行   }, deep:true / ...

  9. C++快速读入

    使用C++的标准cin进行读入速度比较慢,尤其是在大数据的情况下,所以我们需要使用一种方法,按照字符读入,最后再"组装"成整数.由于字符读入比数字要快,所以这样做可以提高读入速度. ...

  10. 【PHP数据结构】其它排序:简单选择、桶排序

    这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...