斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论

概述

本文章对应课程第十一章 43节。这篇文章会简单介绍EQS和实际上手使用,为AI添加更丰富的行为逻辑。

目录

  1. 初识EQS
  2. 自定义查询内容
  3. 优化AI

初识EQS

在前几节课中,我们创建了一个简单的AI,这个AI可以根据与玩家的距离,结合网格导航进行自动寻路,以一种近乎固定的行为模式向玩家靠近。在实际游戏开发中,如果存在多个AI角色执行同样逻辑,我们会看到他们会像火车一样沿着同样的轨迹像玩家跑来,这样的AI显得十分的呆板。因此在这节课程中,将会介绍UE 中EQS的相关知识,以开发具有复杂功能且更富有趣味性的AI为目标。

EQS(Environment Query System)是一种用于在场景中搜索和查询指定条件的工具。通过EQS,我们可以指定一个或多个搜索条件,并使用这些条件来查找场景中符合条件的所有元素。EQS可以用于各种场景,例如AI的视觉感知,寻找目标或避开障碍物等。使用EQS,我们可以更容易地实现更像真人的AI,具体的细节,我们边做边说。

启用EQS

EQS功能在UE中是默认关闭的,要使用EQS,我们首先得打开项目设置,在所有设置中搜索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的Debug界面

具体的查询生成器的各种类型、测试的各种类型以及细节面板的参数调整,读者可以自行进行实验。

注意,这个环境查询不会考虑不在导航网格内的情况,就像图中这样:

考虑的点位在导航网格外

如果最终选择的坐标在导航网格外,AI角色将会一直傻站在原地。这也是我之前建议选择采自最佳25%的单一随机项的原因,至少不会每次查询的结果一样导致AI卡死在导航网格的边缘。

当然,我们也可以设置环境查询只查询导航网格内的位置。如下图所示,

修改检测模式

将查询生成器细节面板-投射数据-检测模式修改为导航,这样就只会考虑导航网格体内的位置了。

自定义查询内容

简单入门EQS后,让我们回到实际应用上来。正如前两节课做的那样,我们并不想让环境查询生成在AI角色身边,而是生成在玩家角色的身边,这样才能实现AI角色向玩家角色移动。

在EQS里,控制环境查询生成位置的类叫做EnvQueryContext,之前提到的EnvQueryContext_Querier也是该类的对象。相应的,我们可以自定义Context,这里我们使用蓝图的方式创建一个EnvQueryContext_BlueprintBase,将其命名为QueryContext_TargetActor,用于获取玩家控制的角色。

创建蓝图

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

重载函数:提供单一Actor

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

蓝图节点,记得修改默认值

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

修改居中(Center)

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

环境查询的点围绕玩家控制的角色

优化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初体验:从智障到智慧的更多相关文章

  1. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》

    3.碰撞检测 碰撞检测的概述: 碰撞在物理学中表现为两粒子或物体间极端的相互作用.而在游戏世界中,游戏对象在游戏世界自身并不受物理左右,为了模拟真实世界的效果,需要开发者为其添加属性,以模拟真实事件的 ...

  2. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  3. Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物

    如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...

  4. Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...

  5. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇:简介及目录》(附上完整工程文件)

    G-3D引擎2D射击类游戏制作教程 游戏类型: 打飞机游戏属于射击类游戏中的一种,可以划分为卷轴射击类游戏. 视觉表现类型为:2D 框架简介: Genesis-3D引擎不仅为开发者提供一个3D游戏制作 ...

  6. Unity-2017.3官方实例教程Space-Shooter(一)

    由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(二) 章节列表: 一.从Asset Store中下载资源并导 ...

  7. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  8. Web 开发中应用 HTML5 技术的10个实例教程

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  9. 值得 Web 开发人员收藏的20个 HTML5 实例教程

    当开始学习如何创建 Web 应用程序或网站的时候,最流行的建议之一就是阅读教程,并付诸实践.也有大量的 Web 开发的书,但光有理论没有实际行动是无用的.现在由于网络的发展,我们有很多的工具可以用于创 ...

  10. BPEL 实例教程

    http://www.oracle.com/technetwork/cn/articles/matjaz-bpel1-090722-zhs.html BPEL 实例教程 作者:Matjaz Juric ...

随机推荐

  1. 快速启动Stable Diffusion WebUI

    快速启动Stable Diffusion WebUI详情    产品文档   输入文档关键字查找   机器学习PAI 产品概述 快速入门 操作指南 准备工作 开通PAI并创建默认工作空间 开通并授权依 ...

  2. 非全自研可视化表达引擎RuleLinK可视化之路

    导读 上一篇<非全自研可视化表达引擎-RuleLinK>介绍了RuleLink的V1.0版本,虽说一定程度上消除了一些配置相关的样板式代码,也肉眼可见的消除了一些研发资源的浪费:RuleL ...

  3. Windows下VC++编译器32位memcpy、memmove函数汇编代码详解

    整理者:赤勇玄心行天道 QQ号:280604597 微信号:qq280604597 QQ群:511046632 博客:www.cnblogs.com/gaoyaguo  blog.csdn.net/c ...

  4. Pinely Round 2 (Div. 1 + Div. 2) (CF1863)

    本来开了某场远古 Div 1,然后学了一堆前置知识至今仍然不会 E.换一场写来得及吗? A. Channel 模拟,略. B. Split Sort Description 给你一个长度为 \(n\) ...

  5. JUC并发编程学习笔记(七)常用的辅助类

    常用的辅助类 CountDownLatch 这是一个JUC计数器辅助类,计数器有加有减,这是减. 使用方法 package org.example.demo; import java.util.con ...

  6. Error running 'TestAlterNickname.test': Command line is too long. Shorten command line for TestAlterNickname.test or also for JUnit default configuration

    问题描述 如图IDEA报错问题,发生在我用JUnit进行测试时. 解决方法 1. 直接点击 default 2. Modify options -> Shorten command line 3 ...

  7. P-III曲线水文频率计算程序(方法)

    P-III曲线水文频率计算程序(方法) 最近遇到水文频率曲线拟合计算相关的问题,在网上查阅了一下,毕竟是专业性比较强的知识内容,好像没有比较系统全面的资料,一时兴起,做了一些研究,总结了一下所了解的一 ...

  8. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;

    #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 #include<intrins.h> //因为要用到左右移函数,所以加入这个头文件 ...

  9. .NET周刊【11月第3期 2023-11-19】

    国内文章 .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试 https://www.cnblogs.com/FreeSql/p/17836 ...

  10. nginx的keepalive和keepalive_requests(性能测试TPS波动)

    当使用nginx作为反向代理时,为了支持长连接,需要做到两点: 从client到nginx的连接是长连接 从nginx到server的连接是长连接 保持和client的长连接: http { keep ...