BlueRoseNote/03-UnrealEngine/Gameplay/GAS/(6)GAS AbilityTask节点功能整理.md
2023-06-29 11:55:02 +08:00

124 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 有用的GameplayTasks整理
## 前言
整理了一下GameplayTasks节点在此分享给大家。
## 自带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_WaitTargetDataUsingActorGASShooter的改进版本等待接收已经生成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"));
```