//将能力赋予角色时调用 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= 是否是“取消”结束
