斯坦福课程 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. 其它——Apache-ab压力测试工具使用

    文章目录 一 介绍 二 安装 2.1 windows安装 2.2 Linux安装 三 使用 四 参数介绍 一 介绍 Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工 ...

  2. Skywalking APM监控系列(一丶.NET5.0+接入Skywalking监听)

    前言 新项目采用的abp vnext的微服务模块化架构,所以把应用的服务拆成了很多独立模块 在初期,我们通过日志还能跟踪到问题, 后期服务越来越多(大约扩充到了十几个),随着调用链路越来越深 ,问题也 ...

  3. Spring扩展接口(3):BeanFactoryPostProcessor

    在此系列文章中,我总结了Spring几乎所有的扩展接口,以及各个扩展点的使用场景.并整理出一个bean在spring中从被加载到最终初始化的所有可扩展点的顺序调用图.这样,我们也可以看到bean是如何 ...

  4. 实验2_C语言分枝与循环基础应用编程

    试验任务1 task 1.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N ...

  5. 字符串匹配|kmp笔记

    很久之前学的了. 我很懒,不太喜欢画图. 做个笔记回忆一下: kmp 朴素比对字符串 所谓字符串匹配,是这样一种问题:"字符串 T 是否为字符串 S 的子串?如果是,它出现在 S 的哪些位置 ...

  6. IDEA配置maven引入包时报Unable to import maven project: See logs for details 错误的解决办法

    这也是我遇到的问题,在此记录下一,当时百度了一下午试过了各种方法,最后看到了一位大佬的博客解决了这个问题. 所以我也抄一下大佬博客也是记录一下问题的解决过程,以免下次遇到相似问题再浪费不必要的时间 参 ...

  7. 【pwn】ez_pz_hackover_2016 --pwngdb和pwntools的结合,动态调试

    首先checksec 没开nx,说明堆栈可执行,初步考虑需要shellcode,然后拖进ida看主函数逻辑 看chall函数   printf("Yippie, lets crash: %p ...

  8. 小景的Dba之路--压力测试和Oracle数据库缓存

    小景最近在做系统查询接口的压测相关的工作,其中涉及到了查询接口的数据库缓存相关的内容,在这里做一个汇总和思维发散,顺便简单说下自己的心得: 针对系统的查询接口,首次压测执行的时候TPS较低,平均响应时 ...

  9. python之史上最详细if教程

    目录 简单的if语句 关系运算符 if-else语句 if-elif-else语句 使用多个elif代码块 省略else代码块 测试多个if 简单的if语句 if语句,顾名思义就是如果...那么就.. ...

  10. Flask Session 登录认证模块

    Flask 框架提供了强大的 Session 模块组件,为 Web 应用实现用户注册与登录系统提供了方便的机制.结合 Flask-WTF 表单组件,我们能够轻松地设计出用户友好且具备美观界面的注册和登 ...