目标定位系统

前言

GCS_TargetingSystemComponent,它利用自UE5.2以来内置的"Gameplay Targeting System",来实现潜在目标的搜索过滤和排序,以及目标的锁定逻辑。

因此,确保你的项目启用了该插件。

目标定位系统.001

并查看官方文档对其进行一个大致的了解。

定位系统组件

当你将GCS_TargetingSystemComponent添加到你的角色后,你可以配置如下的默认属性。

目标定位系统.002

AutoUpdatePotentialTargets:勾选后,该组件会根据组件的Tick频率搜索潜在的目标并存入PotentialTargets

TargetingPreset:可以指定一个用于搜索潜在目标的定位预设。

默认TargetingPreset

GCS默认提供一个TP_GCS_Default

它的配置如下:

目标定位系统.003

它实现的功能是:通过球形检测20米内的Pawn碰撞类型的目标,并通过距离从小到大进行排序,且仅过滤敌方阵营,且过滤拥有Death标签或者已经死掉的角色。

性能考虑:当你的游戏中拥有大量的Actor时,每个Actor通过球形检测潜在目标在性能上是不可取的。

你可以通过调整TargetingSystem组件的tick频率缓解性能压力。

实际开发中,你可能需要一个独立的系统来缓存场景中所有战斗Actor的引用,并从中查询,这样能减少碰撞检测带来的性能压力。

玩法集成

目标锁定/切换

定位系统组件提供如下API,可以让你选择和切换目标。你在GCS提供的内容中能找到如何将此功能绑定到输入系统。

目标定位系统.004

同时,你也可以通过事件,针对目标的锁定和解锁做出响应,比如下图,当目标锁定/解锁时,我会切换不同的相机模式。

目标定位系统.005

注意:当你锁定了一个目标,但是该目标已经不属于“PotentialTargetActors”时,会自动解锁。

查询API

目标定位系统.006

你可以随时通过PotentialTargets来查询一个Actor的潜在目标,这在整合到AI系统时会很有用。

GameplayTargetingSystem拓展

GameplayTargetingSystem是官方提供的数据驱动的方式,用于目标定位请求,你通过创建不同的TargetingPreset,并在其中组合不同的TargetingTask,以实现简单到复杂的目标获取,过滤,排序。

基础用法

目标定位系统.007
目标定位系统.008

GameplayTargetingSystem提供的用法中,如下两种是最常见的。

第二种用法更为灵活,允许你传入更多信息到TargetingSourceContext。

你可以在GCS提供的资产中找到大量相关的用法。这些都被整合到了子弹系统,武器系统中。因此大多数情况下你只需要关心如何配置TargetingPreset。

内置TargetingTask

下面是GCS内置的一些常用的TargetingTask。

GCS:Selection Task Trace

该Task用于获取一个或者多个目标的主要方式。这是对系统默认提供的Targeting Selection Task Trace的拓展,允许你以各种方式进行碰撞检测。

目标定位系统.009

动态检测等级

实现了动态等级系统,当你进行定位时,可以从外部获取检测等级,从而动态地调整碰撞检测的形状,大小,半径等。这需要TargetingContext中的SourceObject实现了GCS_TargetingSourceInterface

在GCS中,碰撞检测实例实现了TargetingSourceInterface,并将碰撞检测实例的激活时间作为检测等级,这意味着,你可以随着碰撞检测实例的激活时长,动态地调整该SelectionTask所用到的检测形状。

GCS:Filter Task Tag Requirements

用于从已经选择的目标当中过滤掉某些Actor。

目标定位系统.010

在这里你可以编辑名为QueryMushMatch的Tag查询,只要Actor满足此查询,就会从目标结果中过滤掉。你也可以勾选Invert反转Tag查询的结果。

GCS:Filter Task Affiliation(阵营判断)

目标定位系统.011

你可以勾选检测敌人,中立目标,以及友方。

LookCombatTeamAgentInterface:若勾选,它会使用阵营队伍集成来判定阵营。

LookCombatTeamAgentInterfaceInComponents:若勾选,它会在Actor的组件树上查询GCS_CombatTeamAgentInterface的实现。

LookGenericTeamAgentInterface:若勾选,则在上面两种方式都失败的情况下,会通过UE自带的AIModule中的队伍接口进行阵营判断,但是自带的接口只能通过C++使用。

如果你使用阵营队伍集成,你需要给角色的GCS_CombatTeamAgent组件上配置不同的队伍ID,然后角色之间才能相互伤害。

定位源接口

在自定义Targeting Selection Task时,你需要通过TargetingSourceContext传递外部信息到Task内部,同时你也希望能够更方便地从内部访问外部信息,而无需关心具体的外部对象类型。

而GCS通过GCS_TargetingSourceInterface接口解决这种问题。

目标定位系统.012

使用方式

GCS内置的SelectionTaskGCS:Selection Task Trace可以与该接口很好地配合使用。只需要将实现了GCS_TargetingSourceInterface的对象通过SourceObject传递到SelectionTask即可。

目标定位系统.013

其他用途

假设你在制作一个炸弹,且该炸弹爆炸时,会在3秒内扩散性地轰炸到一定范围内的所有目标。

那么你可以让炸弹实现定位源接口,并配合一个球形SelectionTask获取半径内的目标,随着爆炸时间从0~3,该球形的半径也会逐渐扩大到最大范围。