斯坦福 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