UE5 Gameplay Targeting System简单介绍

总结


允许您需要数据驱动的目标请求
下面主要说明如何在 Blueprint 中使用 Gameplay Targeting System Plugin(以下简称 Targeting System)。

本文仅作翻译。
看了官方文档的用户,可以直接看 8.应用示例

开始

从 Plugins 启用 Targeting System。
在这里插入图片描述

TargetRequest

在 Targeting System 中,您可以通过执行 TargetRequest来获取 Target 目标。 有两种类型的目标请求:即时目标请求和异步目标请求。

1. 同步(即时)目标请求

Immediate Target Requests 允许您在执行目标请求后立即检索目标。
由于同步处理,在目标请求完成之前,将阻挡程序执行。
请使用TargetingSubsystemExecuteTargetingRequest节点。
在这里插入图片描述
在下面介绍 Targeting Preset 和 Targeting Source Context。
Completion Dynamic Delegate是在目标请求完成时调用的委托。 Targeting Request Handle在3介绍。

2. 异步目标请求

异步目标请求允许您在执行目标请求后异步检索目标。 由于异步处理,在目标请求完成之前可能不会阻止程序执行(官方文档指出游戏线程可能不会被阻止,因此本文也说明这是一种可能性)。

要执行异步目标请求,请使用 TargetingSubsystem 的 StartAsyncTargetingRequest 节点。
在这里插入图片描述
此节点的输出将是 Targeting Request Handle。

3.Targeting Request Handle 目标请求句柄

TargetingRequestHandle是一种用于检索目标请求结果的数据结构。
对于直接目标请求,可以将其视为 Delegate 的 input 参数。
对于异步目标请求,它不仅可以作为 Delegate 的输入参数获取,还可以作为 TargetingSubsystem 中 StartAsyncTargetingRequest 的输出获取。

4. 检索请求结果

要获取目标请求的结果,有两个节点:
GetTargetingResults :可以通过传递 TargetRequestHandle 作为输入来检索与该请求对应的结果(作为 HitResults 数组)。
在这里插入图片描述

GetTargetingResultsActors :与 GetTargetingResults 类似,将 TargetingRequestHandle 作为输入传递,从与该请求对应的结果中获取目标 Actor 数组
在这里插入图片描述
例如,使用 immediate target request 获取请求结果的过程可能如下所示。
在这里插入图片描述
在异步目标请求的情况下,我认为可以以同样的方式获取 delegate 事件中目标请求的结果。 您可以保留 StartAsyncTargetRequest 输出中的目标请求句柄,并在目标请求完成后随时获取目标请求结果。

我们已经解释了如何执行 Target 请求以及如何获取请求结果
接下来我们来谈谈我们一直推迟解释的 Target 请求输入, Targeting PresetInSourceContext


5. Targeting Preset

定位预设是一种数据资产,它设置了一个流程(TargetingTask),用于在请求目标时确定目标。
TargetingPreset只能配置TargetingTasks

请求目标时,按从上到下执行 TargetingPreset 中设置的TargetingTask以获取目标。

下图是具有两个TargetingTaskTargetingPreset示例,TargetingPreset希望使用预设的TargetingSelectionTaskAOE获取范围内的目标,并按接近顺序对结果进行排序。
在这里插入图片描述

6. TargetingTask

按处理的内容,大致可分为三类:选择、筛选和排序目标。
Targeting System 提供的预设 Targeting Task 如下。

名字类别解释
TargetingFilterTask_ActorClass筛选筛选任务,用于指定要过滤和不过滤的 Actor
TargetingFilterTask_SortByDistance排序Source 中的位置排序的排序任务。 Source 的位置由 SourceContext 中 SourceActor 的 ActorLocation 或 SourceLocation确定
TargetingSelectionTask_AOE选择获取与源位置中心区域发生碰撞的所有Actor。它不仅支持多种形状(盒子、圆柱体、球体、胶囊),还支持在Component标签中指定的源Actor上使用组件。AOE被认为是Area of Effect的缩写。
TargetingSelectionTask_SourceActor选择获取 SourceContext 中指定的 SourceActor 的任务
TargetingSelectionTask_Trace选择在 LineTrace/SweepTrace 中获取第一个碰撞 Actor 的任务

您还可以创建自己的定位任务。 我还没有研究过 Targeting Task 的创建,所以我不会详细介绍,但似乎每个类别都有一个父类(见官方文档,可以直接继承)。

类别使用哪个父类?
选择TargetingTask (目标任务)
滤波器TargetingFilterTask_BasicFilterTemplate
排序TargetingSortTask_Base

在这里插入图片描述

7.InSourceContext

是目标请求的上下文数据的数据结构,在目标请求时保存 Source Actor、Instigator Actor 和 Source 的位置。
在这里插入图片描述
例如,TargetingSelectionTask_Trace 从 Source 的位置开始追踪,但 Source 的位置使用 Targeting Source Context 中给定的 Source Actor(如果未设置 Source Actor,则使用 Source 的位置)。

这是对 Targeting Preset 和 Targeting Source Context 的说明。
通过准备 Targeting Preset,TargetingSourceContext及Delegate,您可以执行 Target 请求、接收 Target 请求的结果并处理结果。

8.应用示例

虽然这是一个示例,但我认为执行即时目标请求时的处理流程如下。
在这里插入图片描述

其它

调试命令

有一个调试功能,可以在 HUD 上显示和可视化目标请求的结果。 控制台命令本身在官方文档中有说明。

GameplayAbility 的任务节点

我还没研究过,所以没列出来,不过好像 Gameplay Ability 也有一个任务节点。
PerformTargetingRequest
PerformTargetingAsyncAction
在这里插入图片描述

释放TargetingRequestHandle

如官方文档中所述,除非您自行删除与 Targeting Request Handle 对应的结果,否则它们将保留,并且不会自动发布(无论它们是立即还是异步目标请求)。
在 Blueprint 中似乎无法删除与 TargetingRequestHandles 对应的结果,因此如果需要,可以使用 C++。 看起来您需要在 中创建一个节点。 (TargetingSubsystem 中有一个 RemoveAsyncTargetingRequestWithHandle,但 TargetingRequestHandle 是蓝图上的输出,且与指定为输入的 Targeting RequestHandle 对应的目标请求似乎没有删除结果的节点。)
如果您使用 AbilityTask 的 PerformTargetingAsyncAction 节点或 PerformTargetingRequest 节点来生成TargetingRequestHandle,则可以使用 TargetingSubsystem 的 ExecuteTargetingRequestWithHandle,在异步目标请求的情况下,似乎通过调用 RemoveAsyncTargetingRequestWithHandle 删除了结果。

TRANVV评论:
使用 BP 节点“PerformTargetingAsyncAction”,在代码中搜索 bReleaseOnCompletion它将完成所有这些工作并将其标记为清理。
作者回复:
UAsyncAction_PerformTargeting/UAbilityTask_PerformTargeting上的 Activate() 会将 TaskData 的 bReleaseOnCompletion 设置为 true,因此如果它是异步的,则后跟 UTargetingSubsystem::RemoveAsyncTargetingRequestWithHandle(FTargetingRequestHandle&) 也会将其从 DataStore 中删除(在同步的情况下 UTargetingSubsystem::ExecutTargetingRequestWithHandle(…) UTargetingSubsystem::ReleaseTargetRequestHandle 被调用,因此它会自动删除)。
事实证明,它会被正确删除。 谢谢!

译自:

https://massa8080.hatenablog.com/entry/2023/05/14/154824

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值