//将能力赋予角色时调用 virtual void OnGiveAbility( const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec ) override; //当能力结束时调用 virtual void EndAbility( const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCanceled ) override; 能不能给我讲一下这些参数都是干嘛的?
ChatGPT 说:
好问题 。 这两个函数 (OnGiveAbility
和 EndAbility
) 是 GAS (Gameplay Ability System) 的核心扩展点,它们的参数都和能力的生命周期强相关。下面我给你逐个讲清楚:
- OnGiveAbility
virtual void OnGiveAbility( const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec ) override;
什么时候调用?
当 能力被授予角色 时调用(例如在 AbilitySet、AbilityGrant 里把某个 UGameplayAbility
添加到 ASC)。只会触发一次。
参数解释
-
ActorInfo
(const FGameplayAbilityActorInfo*)-
描述了谁持有这个 Ability。
-
包含 OwnerActor、AvatarActor、PlayerController、AbilitySystemComponent 等引用。
-
你可以通过它快速拿到 Pawn、Controller、ASC。
-
相当于上下文环境。
-
-
Spec
(const FGameplayAbilitySpec&)-
描述了“这个 Ability 的实例”。
-
包含:
-
Ability
指针(即你当前的 UGameplayAbility) -
Level
(技能等级) -
InputID
(触发输入 ID) -
SourceObject
(技能的来源,比如武器/装备) -
Handle
(唯一标识这个技能实例的句柄)
-
-
以后触发、移除这个 Ability 时,都依赖
Spec.Handle
来区分。
-
- EndAbility
virtual void EndAbility( const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCanceled ) override;
什么时候调用?
当 技能主动结束(调用 EndAbility()
)或 被系统强制结束(例如打断、角色死亡、失去条件)时触发。
参数解释
-
Handle
(FGameplayAbilitySpecHandle)-
标识哪一个 Ability 实例要被结束。
-
对应
Spec.Handle
,可唯一标识一个技能实例。 -
在多人游戏里尤其重要,因为同一个 Ability 类可能有多个实例(不同等级、不同来源)。
-
-
ActorInfo
(const FGameplayAbilityActorInfo*)-
和
OnGiveAbility
里的同一个东西。 -
提供上下文:谁在用这个 Ability。
-
-
ActivationInfo
(const FGameplayAbilityActivationInfo)-
描述本次技能是如何被激活的。
-
包含:
-
ActivationMode
(比如 Predicting、Confirmed、Rejected) -
PredictionKey
(用于网络预测/回滚)
-
-
在多人环境下特别有用,用来判断这个技能是“预测激活”还是“已确认”。
-
-
bReplicateEndAbility
(bool)-
是否要把 EndAbility 的调用同步到客户端。
-
一般在服务端调用 EndAbility 时设为
true
,确保客户端也同步结束。
-
-
bWasCanceled
(bool)-
表示这个技能是否是“被取消”结束的。
-
如果是
true
,说明可能被中断/打断;如果是false
,说明是正常完成的。 -
你可以用它来决定是不是播放“被打断动画”,还是播放“完成动画”。
-
- 总结一口气:
-
ActorInfo
= 谁在用能力(上下文) -
Spec
= 哪个能力实例(包含等级、来源、句柄) -
Handle
= 这个能力实例的唯一 ID -
ActivationInfo
= 这次激活的方式(预测/确认/拒绝) -
bReplicateEndAbility
= 是否要同步到客户端 -
bWasCanceled
= 是否是“取消”结束