60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

news/2024/7/22 1:34:01/文章来源:https://blog.csdn.net/qq_30100043/article/details/139239896

UE的Environment Query System(EQS)是环境查询系统,它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据,利用生成器(Generator)针对用户的测试(Test)去筛选符合用户提出条件的最佳项目(Item)。

EQS允许开发者设置多种查询条件和测试,以评估游戏世界中的对象和环境。它提供了可视化的测试结果,便于开发者调试和优化查询。EQS常用于AI决策制定,如寻找最佳路径、选择攻击目标或找到安全位置等。

EQS的实现原理是将场景环境划分成多个点或按场景元素Actor进行划分,然后按照相应的设定规则对划分项进行打分,最后得分最高的Item即为系统所找到的最优查询结果。EQS将这个最优查询结果告知AI,AI行为树则会对来其进行相应的决策及执行。

接下来,我们要通过EQS去实现远程敌人在于玩家中间有物体遮挡时,将会主动移动到合理的位置,进行攻击。实现这个功能过程,我们将使用到EQS的功能,对敌人周围点进行测试,首先测试出来没有被遮挡的位置,然后测试出比较方便移动的位置。
在这里插入图片描述
如果需要查看官方文档,请前往此处 https://dev.epicgames.com/documentation/zh-cn/unreal-engine/environment-query-system-node-reference-in-unreal-engine?application_version=5.3

创建EQS

接下来,我们先创建对应所需文件,由于AI相关的内容比较多,我们先分好文件夹,将对应的内容放置到对应的文件夹中,接着创建EQS文件夹。
在这里插入图片描述
创建完成后,我们打开EQS文件夹,创建场景查询
在这里插入图片描述
我们将其命名为EQ_FindRangedAttackPosition
在这里插入图片描述
接下来,我们创建一个专门用于测试使用的Pawn,它是系统内置的,方便我们调试使用。
在这里插入图片描述
接下来方便测试,我们创建一个新场景,选择新建关卡
在这里插入图片描述
创建一个基础的关卡
在这里插入图片描述
选择保存关卡
在这里插入图片描述
保存到我们的Map文件夹
在这里插入图片描述
接下来将我们制作的测试Pawn拖入到场景中,它将只显示一个胶囊碰撞体,没有其它内容显示
在这里插入图片描述
我们选中测试Pawn,将我们创建查询模板设置给它
在这里插入图片描述
这样就实现了测试使用的场景,后续我们在查询模板内实现对应的功能,就可以在测试场景里面查看。

添加生成器

我们打开场景查询器,发现里面只有一个根,下拉需要我们添加一个生成器。Generators是用于生成潜在查询目标或位置的核心组件。
在这里插入图片描述

  • Actors Of Class 此类Generator的目的是寻找某一类特定的Actor。你可以指定要寻找的Actor种类,并设置搜索半径等参数来限制搜索范围。
    在这里插入图片描述

  • Composite 复合Generator,允许你将两种或多种不同的Generator组合起来,使它们同时生效。
    在这里插入图片描述

  • Current Location 使用当前位置作为采样点。当前位置可以使用Context进行选取,或是询问者自己,或是Context中返回的内容
    在这里插入图片描述

  • Perceived Actors 通过感知组件去寻找某一类型的Actor,相当于Actors Of Class的扩展版本。
    在这里插入图片描述

  • Points:此类型Generator会在一定的范围内遍历若干个点,并筛选其中满足Test条件的点。

  1. Points Circle 环形生成器。选取方式使用参考点(一般是询问者,或是Context提供的数据)向四周转圈发射射线。如果触碰到任何物体则将碰撞位置作为采样点,如无碰撞则以设定最大半径为采样点。可以设定半径和发射间隔角度
    在这里插入图片描述

  2. Points Cone 锥形生成器
    在这里插入图片描述

  3. Points Donut 环状生成器,区别于Circle,此生成器如同水波,一层一层向外扩散,直到最大半径
    在这里插入图片描述

  4. Points Grid 简单的格子生成器,不对采样点进行路径规则校验,不可达位置也将被收集。收集方式:以参照位置(一般是询问者)为基准,垂直向上向下进行导航投射,如有导航覆盖,则返回采样点。
    在这里插入图片描述

  5. Points Pathing Grid 格子生成器,采样点必须是导航可达,需要满足导航规则校验。收集方式:以参照位置(一般是询问者)为基准,垂直向上向下进行导航投射,如有导航覆盖并且参照位置可达,则返回采样点。
    在这里插入图片描述

我们要实现敌人AI如果攻击目标前方有障碍物阻挡攻击路线时,能够切换位置去攻击,那么,我们将Points Pathing Grid 节点去实现遍历它附近的可导航到的位置点,然后进行攻击。
在这里插入图片描述
参数这里按需要调整
在这里插入图片描述
生成的点的数量影响结果以及效率,所以,需要我们按需去设置合理的参数
在这里插入图片描述

对点进行检测

前面,我们生成了周围的可移动的点,接下来,我们要实现对这些点进行检测,查找出一个最合理的点,让敌人可以移动到目标位置进行攻击。
再生成节点上面,提示我们鼠标右键点击添加测试。
在这里插入图片描述
接下来,我将从官网截图来解释每个测试的功能

  • Distance 距离测试节点,将选择器选取的点用给予和参照内容进行距离测试。距离越远则分值越大,如果希望越近分值越大请调整Score中的Scoring Equation,将线性递增改为递减(Inverse Linear)
    在这里插入图片描述

  • Dot 使用点乘的方式,为选取点打分,值域范围0-1(点乘有负数,打分无负数,正面为1,背面为0,呈现扇形左右递增向1)。也可以对结果进行绝对值设定(勾选Absolute Value,结果为点乘后绝对值值域0-1,正面1,背面1,左右两边0)。点乘中的向量选取可以使用两点方式或是Rotation方式。
    在这里插入图片描述
    在这里插入图片描述

  • Gameplay Tags 使用标签进行询问测试 GamePlay Tags本身是为Actor查询操作提供分层,一般用于查询。
    在这里插入图片描述

  • Overlap 在采样点,使用通道检测方式,返回是否有符合通道标记的内容存在。如存在返回1,反之返回0。检测形状,Box,Sphere,Capsule。用于检测查询某一个点附近是否存在某一样东西。
    在这里插入图片描述
    在这里插入图片描述

  • Pathfinding 将采样点与内容进行导航寻路器测试,可达则分数1,不可达为0。它将用于最终测试点生成,返回一个可达测试点。
    在这里插入图片描述
    在这里插入图片描述

  • Pathfinding Batch 将采样点与内容进行导航寻路器测试,可达则分数1,不可达为0。它会返回所有可达点,供下个测试项目使用。
    在这里插入图片描述
    在这里插入图片描述

  • Project 投射测试。可以用来修正生成器采样点位置。两种模式:导航投射,在采样点为基准,垂直向上向下进行导航检测,碰到导航覆盖点则修正采样点位置。形状检测,不考虑导航,只要在通道碰撞成立,则修正采样点到新的位置。
    在这里插入图片描述
    在这里插入图片描述

  • Trace 射线测试。用来测试采样点,到Context参照点之间是否存在遮挡,这是重要节点,一般可以用来寻找可以用来躲避的采样点(从采样点到敌人之间存在遮挡则认定可以躲避)。存在遮挡分数为1,不存在为0。注意:需要考虑高度问题,采样点一般均在地面,从地面直接发射射线到Context可能会出现被非常矮的物体阻挡,可以通过调整Height Offset解决此问题。
    在这里插入图片描述
    在这里插入图片描述

添加测试

前面我们讲解了每个测试节点的功能,接下来,我们将实现敌人寻找位置的功能。我们需要对所有的点进行检测,首先就是筛选掉那些无法查看到目标的点,然后将点和敌人进行距离判断,获取到一个最近的点,就是敌人需要移动到的攻击点位。
我们先添加一个Trace测试,这个测试用于检查AI是否能够直接看到目标,相当于射线检测。
在这里插入图片描述
在测试目的这里,有三个选项
在这里插入图片描述
它们的功能是筛选和评优先级
在这里插入图片描述
在检测这里,现在我们还是对AI所有者进行检测,被墙壁阻挡的点是无法通过筛选的。
在这里插入图片描述
但是我们需要筛选的目标不是AI持有者,而是玩家目标,引擎内置了两个选项
在这里插入图片描述
所以我们需要自定义一个用于获取玩家目标的,我们创建一个蓝图,继承至EnvQueryContext_BlueprintBase
在这里插入图片描述
将其命名为EQS_PlayerContext
在这里插入图片描述
我们需要重载内置的函数来实现返回,在需要调用时去实现调用
在这里插入图片描述

  • 提供单一位置:将由开发者自己定义一个位置返回。
  • 提供单一Actor:将有开发者提供一个可放置到场景中的对象返回
  • 提供位置集:需要返回一个位置数组
  • 提供Actor集:需要返回一个Actor数组

我们需要的是将玩家角色返回,所以重载提供Actor集
在这里插入图片描述
我们通过GetAllActorsOfClass在场景中寻找指定类的Actor,返回即可。
在这里插入图片描述
设置使用我们的情景
在这里插入图片描述
打开测试场景,发现,有些点被墙壁格挡无法查看到角色
在这里插入图片描述
由于红色才是留下来的点,所以,我们可以选择布尔匹配
在这里插入图片描述
在这里插入图片描述

接下来,我们使用距离测试来获取到最佳的移动点位,设置值评优先级,计算和AI的距离
在这里插入图片描述
我们会发现没有过滤的点上面都有优先级,点越绿,数值越高,优先级也就越高
在这里插入图片描述
所以我们将得分因数修改为-1
在这里插入图片描述
得到了我们理想的位置
在这里插入图片描述

在行为树中实现远程攻击

我们在远程攻击下面添加一个Run EQSQuery
在这里插入图片描述
查询模板设置我们创建的环境检测器,黑板健设置接收数据的健
在这里插入图片描述
然后增加一个MoveTo任务,移动到攻击位置
在这里插入图片描述
接着调用攻击,然后等待,我们就可以测试效果了。
在这里插入图片描述
现在,敌人自动躲避障碍物进行攻击,设置如果其他Actor遮挡了,也能够移动寻找不被躲避的位置。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1053413.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

列表、元组、字典和集合的区别

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前面介绍了序列中的列表、元组、字典和集合的应用,下面通过表2对这几个数据序列进行比较。 表2 列表、元组、字典和集合的区别 数 据…

985上交应届生转正12天,被某东辞退了!

👇我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。 01.事情起源 最近粉丝群都在转发一个截图,某应届毕业生在某东实习一年,才转正才12天,就因为自己调侃…

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言,研究生阶段接触c上手有点困难,今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车(一般是回车)后cin.get()才…

ssm球场计费管理系统-计算机毕业设计源码77275

摘 要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在球馆计费管理的要求下,开发一款整体式结构的球场计费管理…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

BIO/NIO学习

在传送文件的时候常常出现这么一个问题,就是当客户端的文件全部传送完了之后,服务器没有接收到客户端那边传过的停止信号,所以服务器也就跟着客户端停止运行了,我们可以使用 try {socket.shutdownOutput();} catch (IOException e…

2024 年科技裁员综合清单

推荐阅读: 独立国家的共同财富 美国千禧一代的收入低于父辈 创造大量就业机会却毁掉了财富 这四件事是创造国家财富的关键 全球财富报告证实联盟自始至终无能 美国人已陷入无休止债务循环中,这正在耗尽他们的财务生命 2024 年,科技行业…

鸿蒙OS开发:典型页面场景【一次开发,多端部署】(信息应用)案例

信息应用 简介 内容介绍 Mms应用是OpenHarmony中预置的系统应用,主要的功能包含信息查看、发送短信、接收短信、短信送达报告、删除短信等功能。 架构图 目录 /Mms/ ├── doc # 资料 ├── entry │ └── src │…

解决vue版本不一致导致不能正常编译

解决vue版本不一致导致不能正常编译 异常现象分析原因解决方案 异常现象 项目原本运行无异常,但安装了一个el-table-infinite-scroll的插件后,编译报错,截图如下 分析原因 vue版本与compile版本不一致,应该统一起来&#xff0…

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段,后端创建对应的实体类的时间属性需要设定格式(默认的格式不方便阅读),再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中,每个类默认都会继承自object类,而object类在Python中是一个动态类,允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活,但同时也带来了一些性能和内存使用上的开销。 为了解决这个…

Matlab读取Swarm球谐系数,并绘制EWH全球格网图(存在疑问)

ICGEM官网下载 COST-G发布的4040的球谐系数 close all; clearvars -except; % addpath(E:\Code\Tool\Function\GRACE_functions); dir_degree_1 E:\Code\GRACE_data\Degree_1\deg1_coef.txt; dir_c20 E:\Code\GRACE_data\Degree_2\C20_RL06.txt; myDir_Swarm E:…

pyinstaller打包提示“文件所在的卷已被外部更改,因此打开的文件不再有效。”

环境 anaconda : 24.1.2python : 3.7.13pyinstaller : 5.13.0 问题描述 之前使用pyintaller执行spec文件打包都是能成功,今天打包报了“文件所在的卷已被外部更改,因此打开的文件不再有效。”的错误 Traceback (most recent call last):File "C…

广场舞团|基于SprinBoot+vue的广场舞团系统(源码+数据库+文档)

广场舞团系统 目录 基于SprinBootvue的广场舞团系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 后台登录模块 5.2.1管理员功能模块 5.2.2社团功能模块 5.2.3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

【Python编程实战】基于Python语言实现学生信息管理系统

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端? 在SpringCloud的Config配置中心中分了Server服务端和Client客户端,为什么需要这样分呢?它的思想是所有微服务的配置文件都放到git远程服务器上,让…

01 一文理解,Prometheus详细介绍

01 一文理解,Prometheus详细介绍 介绍 大家好,我是秋意零。 Prometheus 是一个开源的系统监控和报警工具包,最初由SoundCloud开发,并在2012年作为开源项目发布。Prometheus 目前由Cloud Native Computing Foundation&#xff08…

Leecode热题100---二分查找---搜索插入位置

题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 nums 为 无重复元素 的 升序 排列数组 常规思路: class Solution { public:int f…

如何克隆非默认分支

直接git clone下来的我们知道是默认分支,那如何克隆其他分支呢: 比如这个,我们想克隆AdvNet。 我们可以在本地文件夹打开Git Bash 依次输入: git clone --branch AdvNet https://github.com/wgcban/SemiCD.git cd SemiCD git b…