信息
· 文章中可能会出现一些错误,希望大佬们可以在评论区指出;
08 - Target Data
本文主要说明了UE5中Gameplay技能系统(Gameplay Ability System, GAS)中 Target Data 的相关内容。
概述
TargetData(即FGameplayAbilityTargetData类)是UE5 GAS中用于通过网络传输定位数据(如FHitResult等)的通用结构体。客户端在获取到准确的定位数据后通过调用ServerSetReplicatedTargetData()将该数据发送给服务器的 TargetSet,在服务器上进行进一步处理,并将权威结果发送给客户端进行后续处理。
UE5官方在GameplayAbilityTargetTypes.h中实现了基于FGameplayAbilityTargetData类的如下TargetData类型:
FGameplayAbilityTargetData_LocationInfo:传递位置信息;FGameplayAbilityTargetData_ActorArray:传递一组Actor;FGameplayAbilityTargetData_SingleTargetHit:传递HitResult;
上述实现一般能满足大部分用途,如果还有其他特殊用途需要自行实现新的TargetData类型。
简单使用
SingleTargetHit
该类型TargetData封装了FHitResult,适合传递一些简单的碰撞检测信息。在Aura项目中,该类型被用于传递视口鼠标射线检测的结果:
AT_TargetDataUnderMouse.cpp点击展开/折叠代码
void UAT_TargetDataUnderMouse::SendMouseCursorData()
{
// 此作用域参与客户端网络预测
FScopedPredictionWindow ScopedPrediction(AbilitySystemComponent.Get());
// 通过PlayerController获取鼠标指向对象的位置
APlayerController* PlayerController = Ability->GetCurrentActorInfo()->PlayerController.Get();
FHitResult CursorHit;
PlayerController->GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
// 存入TargetData, 并发送到服务器
// 这里的new不必担心, 后续Handle.Add()会将其封装到共享指针中
FGameplayAbilityTargetData_SingleTargetHit* TargetData = new FGameplayAbilityTargetData_SingleTargetHit();
TargetData->HitResult = CursorHit;
FGameplayAbilityTargetDataHandle TargetDataHandle;
TargetDataHandle.Add(TargetData);
AbilitySystemComponent->ServerSetReplicatedTargetData(
GetAbilitySpecHandle(),
GetActivationPredictionKey(),
TargetDataHandle,
FGameplayTag(),
AbilitySystemComponent->ScopedPredictionKey
);
// 客户端的预测广播, 为了减少延迟
if (ShouldBroadcastAbilityTaskDelegates())
{
OnValidDataGet.Broadcast(TargetDataHandle);
}
}
