斯坦福 UE4 C++ ActionRoguelike游戏实例教程 03.EQS初体验:从智障到智慧
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论
概述
本文章对应课程第十一章 43节。这篇文章会简单介绍EQS和实际上手使用,为AI添加更丰富的行为逻辑。

目录
- 初识EQS
- 自定义查询内容
- 优化AI
初识EQS
在前几节课中,我们创建了一个简单的AI,这个AI可以根据与玩家的距离,结合网格导航进行自动寻路,以一种近乎固定的行为模式向玩家靠近。在实际游戏开发中,如果存在多个AI角色执行同样逻辑,我们会看到他们会像火车一样沿着同样的轨迹像玩家跑来,这样的AI显得十分的呆板。因此在这节课程中,将会介绍UE 中EQS的相关知识,以开发具有复杂功能且更富有趣味性的AI为目标。
EQS(Environment Query System)是一种用于在场景中搜索和查询指定条件的工具。通过EQS,我们可以指定一个或多个搜索条件,并使用这些条件来查找场景中符合条件的所有元素。EQS可以用于各种场景,例如AI的视觉感知,寻找目标或避开障碍物等。使用EQS,我们可以更容易地实现更像真人的AI,具体的细节,我们边做边说。
启用EQS
EQS功能在UE中是默认关闭的,要使用EQS,我们首先得打开项目设置,在所有设置中搜索EQS,将图中红框的选项勾选。
勾选完成后,记得要重启编辑器,不然是不会生效的,

创建环境查询
在内容浏览器中右键,选择人工智能->环境查询,创建一个环境查询,将其命名为Query_FindNearbyLocation。
在环境查询中,我们可以自定义一个查询生成器,他可以获取目标周围环境的信息,通过测试(TEXT)对周围环境进行评估,自动选择符合要求的位置。

进入环Query_FindNearbyLocation,将从根节点拖出一条线,选择Point:Donut类型。Point:Donut会在目标周围生成一圈一圈的圆环,每个圆环又由多个点组成。具体的参数设置,读者可以自行在细节面板里查看。

右键新建的节点,在最下面找到添加测试。我们这里选择Distance,他可以以距离作为评分依据,对生成器生成的点进行评分。如下图所示,距离一栏内的到此距离(Distance to)默认为EnvQueryContext_Querier,指的是查询的发起人,也就是AI角色自己,评分依据与相对于AI角色的距离相关。
这里我们需要修改的是过滤器,根据自己的需要修改参数,这里将过滤类型改成了最小,浮点值改成了500,即500cm外的位置才会被考虑进评分。

修改行为树
修改行为树,在上节课的基础上添加一个Run EQS Query,如下图所示

Run EQS Query的细节面板修改为下图所示。
此处的黑板键即为环境查询最后选择的位置,环境查询最终会修改我们这里选择的黑板键,即MoveToLocation;
查询模板即为我们刚才创建的Query_FindNearbyLocation,行为树将会执行Query_FindNearbyLocation;
运行模式可以选择单一最佳项目,但这里我推荐选择采自最佳25%的单一随机项,以增加AI的随机性。
另外注意,我将Move To Player节点的目标也改成了MoveToLocation,这样在执行完环境查询后,AI角色会向修改完成的MoveToLocation移动。

运行测试
运行游戏,可以看到AI小兵满地乱跑。在我们当前的设置下,AI的行为树在执行到环境查询时,会在EnvQueryContext_Querier也就是AI小兵周围进行一次环境查询,在范围内选择一个最佳的点位,赋值给MoveToLocation。紧接着运行Move To Player结点,使AI角色移动到目标坐标上。
对准AI小兵点击'(冒号右边的那个按键),可以调出AI的debug界面,读者可以细细观察一下这个界面有哪些内容。
点击小键盘的3键,可以查看环境查询的结果,如图所示,角色的周围生成了三层圆环,每个环有八个查询点,蓝色的为查询失败,因为我们刚才设置过滤器的时候过滤了500cm以内的位置。绿色的为查询成功,他会根据距离对这个位置进行评分(绿点旁边的数字),在当前设置下分数越高则越优,最终会选择一个位置赋值给MoveToLocation。

具体的查询生成器的各种类型、测试的各种类型以及细节面板的参数调整,读者可以自行进行实验。
注意,这个环境查询不会考虑不在导航网格内的情况,就像图中这样:

如果最终选择的坐标在导航网格外,AI角色将会一直傻站在原地。这也是我之前建议选择采自最佳25%的单一随机项的原因,至少不会每次查询的结果一样导致AI卡死在导航网格的边缘。
当然,我们也可以设置环境查询只查询导航网格内的位置。如下图所示,

将查询生成器细节面板-投射数据-检测模式修改为导航,这样就只会考虑导航网格体内的位置了。
自定义查询内容
简单入门EQS后,让我们回到实际应用上来。正如前两节课做的那样,我们并不想让环境查询生成在AI角色身边,而是生成在玩家角色的身边,这样才能实现AI角色向玩家角色移动。
在EQS里,控制环境查询生成位置的类叫做EnvQueryContext,之前提到的EnvQueryContext_Querier也是该类的对象。相应的,我们可以自定义Context,这里我们使用蓝图的方式创建一个EnvQueryContext_BlueprintBase,将其命名为QueryContext_TargetActor,用于获取玩家控制的角色。

进入蓝图后,重载提供单一Actor函数

节点的连接很简单,这里就不赘述了。在编译完成后,修改TargetActorKey的默认值为黑板键中的TargetActor,使其绑定我们的玩家角色。

修改环境查询生成器的细节面板,使其以我们创建的QueryContext_TargetActor为中心。

保存完毕后运行游戏,可以看见圆环现在生成在玩家角色的周围。由于显示是有一些延迟的,所以得等待一会儿才会更新。

优化AI(修改细节面板)
最后是添加更多更酷的小细节。在之前的设置里,环境查询会以玩家为中心生成三个圆环,事实上并不需要360°围绕玩家生成圆环,只需要在玩家和AI之间生成一道弧线即可。这里可以根据我们的喜好,修改内部半径和外部半径(外部半径可以考虑设置为攻击范围);设置弧形方向,各参数可以自行测试微调。

为了让AI少跑点路,这里将得分因数设置为-1,离AI越近的位置得分将会越高。

运行看看效果。可以看到AI和玩家之间生成了螺旋状的弧线。由于这个弧线效果笔者也不是很清楚是怎么生成的,读者可以自行实验调整,效果差不多就行。

我们还想实现一点更酷的东西。让AI小兵在进行一轮射击后可以自己换位置重新射击,这里我将Move To Sequence的装饰器删掉了,去除了必须在攻击范围外才能移动的限制。

另外,在之前的设置里,即使AI和玩家之间有障碍物,AI也会尝试选取那些看不到玩家的位置,通常需要跑个几次才能看到玩家。为了优化这一点,在环境查询生成器里添加Trace测试内容,细节面板如图所示,注意要取消勾选布尔匹配。如果环境查询的位置与情景对象(也就是Context)有障碍物的话(也就无法进行射线追踪),则会将那一位置筛选出去,AI将不再尝试被筛选掉的位置。


最终效果&总结

这节课我们初步学习了EQS的使用,EQS可以很方便的为AI添加更丰富更智能的行动,将会是很有用的一个功能。
此外,斯坦福的老师还使用了可视化记录器这一工具,可以在窗口->开发者工具里找到,感兴趣的读者可以自行去学习使用。
参考链接
UE4 行为树与EQS https://www.cnblogs.com/biu-we/p/13604795.html
斯坦福 UE4 C++ ActionRoguelike游戏实例教程 03.EQS初体验:从智障到智慧的更多相关文章
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》
3.碰撞检测 碰撞检测的概述: 碰撞在物理学中表现为两粒子或物体间极端的相互作用.而在游戏世界中,游戏对象在游戏世界自身并不受物理左右,为了模拟真实世界的效果,需要开发者为其添加属性,以模拟真实事件的 ...
- Angular2入门系列教程2-项目初体验-编写自己的第一个组件
上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇:简介及目录》(附上完整工程文件)
G-3D引擎2D射击类游戏制作教程 游戏类型: 打飞机游戏属于射击类游戏中的一种,可以划分为卷轴射击类游戏. 视觉表现类型为:2D 框架简介: Genesis-3D引擎不仅为开发者提供一个3D游戏制作 ...
- Unity-2017.3官方实例教程Space-Shooter(一)
由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(二) 章节列表: 一.从Asset Store中下载资源并导 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- Web 开发中应用 HTML5 技术的10个实例教程
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- 值得 Web 开发人员收藏的20个 HTML5 实例教程
当开始学习如何创建 Web 应用程序或网站的时候,最流行的建议之一就是阅读教程,并付诸实践.也有大量的 Web 开发的书,但光有理论没有实际行动是无用的.现在由于网络的发展,我们有很多的工具可以用于创 ...
- BPEL 实例教程
http://www.oracle.com/technetwork/cn/articles/matjaz-bpel1-090722-zhs.html BPEL 实例教程 作者:Matjaz Juric ...
随机推荐
- Debian12安装.NET7 SDK
Debian,作为最受欢迎的 Linux 发行版之一,于 2023 年 6 月 10 日正式发布了其最新版本 Debian 12,代号"Bookworm".Debian 12 带来 ...
- React跨路由组件动画
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:佳岚 回顾传统React动画 对于普通的 React 动画 ...
- Jenkins软件平台安装部署
1.Jenkins软件平台概念剖解: 基于主流的Hudson/Jenkins平台工具实现全自动网站部署.网站测试.网站回滚会大大的减轻网站部署的成本,Jenkins的前身为Hudson,Hudson主 ...
- js前端操作,c#后端下发xml文件
前端: var xmlLanguageDoc; $.ajax({ url: "/GiveMeXML",//此处可随意定义,不一定是路径.在c# ,请求被捕获后,由c ...
- 《HelloGitHub》第 91 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- P8815 [CSP-J 2022] 逻辑表达式
Problem 考察算法:后缀表达式计算.建表达式树.\(DFS\). 题目简述 给你一个中缀表达式,其中只有 \(\&\) 和 \(\mid\) 两种运算. 求:\(\&\) 和 \ ...
- ALSA Compress-Offload API
概述 从 ALSA API 的早期开始,它就被定义为支持 PCM,或考虑到了 IEC61937 等固定比特率的载荷.参数和返回值以帧计算是常态,这使得扩展已有的 API 以支持压缩数据流充满挑战. 最 ...
- What is Conjugate complex number(共轭复数)?
word explain Conjugate 共轭是一个古代汉语词,在农业领域常用, 共轭复数的定义 两个实部相等,虚部互为相反数的复数互为共轭复数. 若Z=a+bi(a,b∈R),则Z*=a-bi( ...
- 牛客多校第五场 K King of Range
题意: 给定一个\(n\)个数得序列\(a_i\),给定\(m\)个询问,每次给出一个\(k\),寻找有多少个区间\([l, r]\)中最大值与最小值之差严格大于\(k\). 思路: 可以发现,如果已 ...
- Codeforces Global Round 13 A-D题题解
写在前边 链接:Codeforces Global Round 13 \(A,B,C,D\) A. K-th Largest Value 链接:A题链接 题目大意: 有一个字串只由\(0.1\)组成, ...