前言
自带GameplayTasks
ApplyRootMotion系列
在对应名称的static函数中调用初始化函数SharedInitAndApply(),其作用为取得CharacterMovementComponent,并调用ApplyRootMotionSource应用构建的FRootMotionSource。
在TickTask实现,取得Avatar(角色类)并且判断MovementComponent的当前FRootMotionSource是否运行结束。并且非Simulation客户端上触发OnFinish委托并强制更新Avatar。其成员变量设置了网络同步属性。该系列有:
- AbilityTask_ApplyRootMotion_Base
- AbilityTask_ApplyRootMotionConstantForce
- AbilityTask_ApplyRootMotionJumpForce
- AbilityTask_ApplyRootMotionMoveToActorForce
- AbilityTask_ApplyRootMotionMoveToForce
- AbilityTask_ApplyRootMotionRadialForce
FRootMotionSource为CharacterMovementComponent的RootMotion的通用源,通过一系列运算(覆盖、增加、设置、忽视)将位移与旋转应用到CharacterMovementComponent。可以认为是一个数值驱动、非动画驱动的RootMotion,引擎中实现了以下类型:
- FRootMotionSource_JumpForce:让目标像跳跃一样移动。
- FRootMotionSource_MoveToDynamicForce:在一定时间内强制将目标移动到指定世界坐标(目标可以在这段时间内随意移动)。
- FRootMotionSource_MoveToForce:在一定时间内强制将目标移动到指定世界坐标。
- FRootMotionSource_RadialForce:在世界指定坐标施加可作用于目标的一个拉扯或者推出的力。
- FRootMotionSource_ConstantForce:对目标施加一个固定数值的力。
本人测试了:
- JumpForce,感觉其作用是可以编写参数化的Jump。(还可以加各种Curve)可改进的地方就是增加跳跃到最高点的Delegate。
- ConstantForce、RadialForce可以做一些场景、怪物击飞效果。
- MoveToForce可以做角色与交互式物体互动式的强制位移。
- MoveToActorForce可以做类似魔兽世界的飞行点快速旅行功能。
GAS系统相关
Ability与AttributeSet
- AbilityTask_StartAbilityState:用于监视所在Ability的状态,会触发Ability的OnGameplayAbilityStateEnded与OnGameplayAbilityCancelled委托。
- AbilityTask_WaitAttributeChange:AbilityTask版本的属性监视Task,拥有WaitForAttributeChange与WaitForAttributeChangeWithComparison(属性比较版本)
- AbilityTask_WaitAbilityActivate:实现了3个版本,用于监视指定Ability的激活事件(通过判断Ability的Tag触发OnActivate委托)。
- AbilityTask_WaitAbilityCommit:实现了2个版本,用于监视指定Ability的Commit事件(通过判断Ability的Tag触发OnCommit委托)。
- AbilityTask_WaitAttributeChangeThreshold:用于监视指定属性变化,数值符合指定比较类型会触发OnChange委托。
- AbilityTask_WaitAttributeChangeRatioThreshold:用于监视由2个属性组合计算出比例变化(l例如生命值与最大生命值),符合指定比较类型会触发OnChange委托。
GameplayEffect
- AbilityTask_WaitGameplayEffectApplied:GameplayEffectApplied系列基类,OnApplyGameplayEffectCallback实现了标签过滤与匹配逻辑。开发时不应该直接调用该类。
- AbilityTask_WaitGameplayEffectApplied_Self:实现Tag与Query两个版本的,将父类处理函数绑定到ASC的OnPeriodicGameplayEffectExecuteDelegateOnSelf。
- AbilityTask_WaitGameplayEffectApplied_Target实现Tag与Query两个版本的,将父类处理函数绑定到ASC的OnPeriodicGameplayEffectExecuteDelegateOnTarget。
- AbilityTask_WaitGameplayEffectBlockedImmunity:绑定ASC的OnImmunityBlockGameplayEffectDelegate,检查EffectSpec的CapturedSourceTags与CapturedTargetTags,会触发Blocked委托。
- AbilityTask_WaitGameplayEffectRemoved:通过GameplayEffectHandle绑定ASC的OnGameplayEffectRemoved_InfoDelegate。会触发OnChange委托,如果Handle无效则会触发InvalidHandle委托。
- AbilityTask_WaitGameplayEffectStackChange:通过GameplayEffectHandle绑定ASC的OnGameplayEffectStackChangeDelegate。会触发OnChange委托,如果Handle无效则会触发InvalidHandle委托。
GameplayEvent与GameplayTag
- AbilityTask_WaitGameplayEvent:根据OnlyMatchExact,绑定ASC的GenericGameplayEventCallbacks与ASC的AddGameplayEventTagContainerDelegate。会触发EventReceived委托。
- AbilityTask_WaitGameplayTagBase:WaitGameplayTag基类,因为没有实现回调函数,所以开发时不应该直接调用该类。
AbilityTask_WaitGameplayTag:根据Tag绑定ASC的RegisterGameplayTagEvent(),会触发Added委托。
AbilityTask_WaitTargetData:Spawn一个TargetData之后等待接收TargetData。
输入
源码的Confirm与Cancel部分有实现3个节点,对于本地端则与ASC的GenericLocalXXXXXCallbacks委托绑定本地版本OnXXXXX回调函数,远程端则调用CallOrAddReplicatedDelegate绑定OnXXXXX回调函数。回调函数在处理完同步相关的逻辑后,会触发FGenericGameplayTaskDelegate类型的OnXXXXX委托。AbilityTask_WaitConfirmCancel会同时监视Confirm与Cancel。
- AbilityTask_WaitCancel
- AbilityTask_WaitConfirm
- AbilityTask_WaitConfirmCancel
Confirm与Cancel的绑定可以参考GASDocument的4.6.2章节。
AbilityTask_WaitInputPress: 绑定ASC的AbilityReplicatedEventDelegate(),监视与Ability绑定的InputAction是否按下。在处理同步相关的逻辑后触发OnPress委托。
AbilityTask_WaitInputRelease:绑定ASC的AbilityReplicatedEventDelegate(),监视与Ability绑定的InputAction是否松开。在处理同步相关的逻辑后触发OnRelease委托。
网络相关
- AbilityTask_NetworkSyncPoint:网络同步等待节点,用于等待Server/Client同步完成。
移动类
- AbilityTask_MoveToLocation:通过TickTask来实现让目标在一定时间内移动到指定世界坐标。(官方注释说这个实现方法不太好有待改进)
- AbilityTask_WaitMovementModeChange:绑定角色类的MovementModeChangedDelegate,触发OnChange委托。
- AbilityTask_WaitVelocityChange:通过TickTask实现。每帧判断Dot(MovementComponent的速度与指定方向)是否超过设定阈值,超过就会触发OnVelocityChage委托。
工具类
- AbilityTask_WaitDelay:使用定时器实现,定时触发一次OnFinish委托。
- AbilityTask_Repeat:使用定时器实现,定时多次触发OnPerformAction委托。
- AbilityTask_SpawnActor:BeginSpawningActor()与FinishSpawningActor()不知道如何在蓝图中调用,所以无法使用SpawnActorDeferred方式。
- UAbilityTask_VisualizeTargeting:因为VisualizeTargeting的相关逻辑写在BeginSpawningActor与FinishSpawningActor,所以也存在上述问题。VisualizeTargetingUsingActor则会Spawn一个TargetActor用于追踪Ability,到时候后悔触发TimeElapsed委托。
- AbilityTask_WaitOverlap:绑定AvatarActor的Root组件的OnComponentHit委托。触发的OnOverlap委托会附带FGameplayAbilityTargetDataHandle(FGameplayAbilityTargetData_SingleTargetHit处理的TargetData)
AbilityAsync
UAbilityAsync是一种Ability相关的定制BlueprintAsyncActions,与GameplayAbilityTasks的不同之处,它可以在任意蓝图类中调用,并且生命周期与Ability无关。
- AbilityAsync_WaitGameplayEffectApplied:等待指定GE(可以限定Target与Source标签)应用到当前Ability所在ASC中。委托来自于ASC。
- AbilityAsync_WaitGameplayEvent:等待GameplayEvent。委托来自于ASC。
- AbilityAsync_WaitGameplayTag:等待GameplayTag。委托来自于ASC。
GASShooter中的GameplayTasks
- GSAT_MoveSceneCompRelLocation:在设定时间内按照设定曲线移动指定的SceneComponent,逻辑在TickTasks中处理。
- GSAT_PlayMontageAndWaitForEvent:播放Montage并且等待GameplayEvent。
- GSAT_PlayMontageForMeshAndWaitForEvent:使指定Mesh播放Montage并且等待GameplayEvent。在GASShooter中用于播放武器Montage,解决播放非Avatar、Owner的Montage的问题。
- GSAT_WaitChangeFOV:在设定时间内按照设定曲线设置Fov,逻辑在TickTasks中处理。
- GSAT_WaitDelayOneFrame:使用GetWorld()->GetTimerManager().SetTimerForNextTick()调用函数,触发OnFinish委托来实现。
- GSAT_WaitInputPressWithTags:将委托AbilitySystemComponent->AbilityReplicatedEventDelegate(根据Ability与PredictionKey取得的同步事件委托)与OnPressCallback绑定,测试模式下直接触发OnPressCallback函数。OnPressCallback逻辑为判断tag是否符合要求,不符合则重置,符合要求则移除AbilityReplicatedEventDelegate绑定,根据Ability的预测类型处理ASC同步事件,最后触发OnPress委托。
- GSAT_WaitInteractableTarget:用于检测可交互物体,使用定时器来不断进行射线求交判断。根据结果触发LostInteractableTarget与FoundNewInteractableTarget委托。
- GSAT_WaitTargetDataUsingActor:GASShooter的改进版本,等待接收已经生成TargetActor发送的TargetData。绑定Delegate为TargetActor的TargetDataReadyDelegate与CanceledDelegate。服务端还会绑定ASC的AbilityTargetDataSetDelegate与AbilityTargetDataCancelledDelegate,以及处理同步事件。
- GSAT_ServerWaitForClientTargetData:绑定ASC的AbilityTargetDataSetDelegate委托。其回调函数会消耗掉客户端ACS的TargetData同步事件。之后触发ValidData委托。(即只处理服务端TargetData同步事件)
这里的AsyncTask并没有使用UAbilityAsync实现而是直接继承自BlueprintAsyncActions进行实现。在项目中主要在UMG获取对应数据:
- AsyncTaskGameplayTagAddedRemoved:监视Tag的增加与减少情况,用于判断状态。
- AsyncTaskAttributeChanged:监视数据值的改变情况,用于设置血条、蓝条数值。
- AsyncTaskCooldownChanged:监视对应Ability的冷却情况,显示技能图标的CD效果。
- AsyncTaskEffectStackChanged:监视GE堆叠情况,用于显示Buffer/Debuffer堆叠情况。
自带的Ability
GameplayAbility_Montage:播放Montage并且应用设置好的GE,并且结束是移除GE。(没什么软用)
GameplayAbility_CharacterJump:使用Ability实现跳跃,激活条件、跳跃方式的逻辑均调用自Character,可以通过override自定义角色类中对应的函数实现扩展。
小部分Tasks的自动绑定机制
像UAbilityTask_WaitTargetData之类的Task会有一些函数没有被调用,这些其实会被UK2Node_LatentGameplayTaskCall进行自动绑定与运行(仅限蓝图),在c++的话需要自己调用这些函数,以及在static函数中调用ReadyForActivation();。会自动绑定运行函数与pin为:
FName FK2Node_LatentAbilityCallHelper::BeginSpawnFuncName(TEXT("BeginSpawningActor"));
FName FK2Node_LatentAbilityCallHelper::FinishSpawnFuncName(TEXT("FinishSpawningActor"));
FName FK2Node_LatentAbilityCallHelper::BeginSpawnArrayFuncName(TEXT("BeginSpawningActorArray"));
FName FK2Node_LatentAbilityCallHelper::FinishSpawnArrayFuncName(TEXT("FinishSpawningActorArray"));
FName FK2Node_LatentAbilityCallHelper::SpawnedActorPinName(TEXT("SpawnedActor"));
FName FK2Node_LatentAbilityCallHelper::WorldContextPinName(TEXT("WorldContextObject"));
FName FK2Node_LatentAbilityCallHelper::ClassPinName(TEXT("Class"));