Init Ability Actor Info

OwnerActor 与 AvatarActor

image-20250305164238600

ASC (AbilitySystemComponent) 需要知道自己是在对谁起作用,以及是谁控制着自己,OwnerActor 是逻辑上拥有此组件的 actor。AvatarActor 是我们正在对其执行操作的物理 actor。通常是一个 Pawn,但它也可能是塔、建筑、炮塔等,可能与 Owner 相同。

  • 对于 AI 控制的角色,如 Enemy Character,一般是把 ASC 放在 Pawn(Character)上,所以 OwnerActorAvatarActor 都是 Enemy Character
  • 对于玩家控制的角色,可能会将 ASC 放在 Pawn(Character) 上或者 PlayerState 上,对于后者,OwnerActor就变成了 PlayerState,AvatarActor 依旧还是 Pawn(Character)

InitAbilityActorInfo 这个函数就是用来初始化这两个信息,对于不同的情况,初始化的时机也不相同

InitAbilityActorInfo 调用时机

image-20250305165829006

1. 玩家控制角色(Player-Controlled)

场景1:ASC 在 Pawn 上

  • 服务器端:在 PossessedBy 中调用
    • 当服务器端的 Controller 接管(Possess)一个 Pawn 时,PossessedBy 事件触发。此时 Pawn 已被绑定到 Controller
    • 此时初始化 ASC 可确保服务器端的技能权限(如技能冷却、效果应用)正确关联到 Pawn
  • 客户端:在 AcknowledgePossession 中调用
    • 客户端需要等待服务器确认 Possession 完成(通过 AcknowledgePossession),此时客户端的 PawnController 已准备就绪。
    • 若在客户端过早调用(如 BeginPlay),可能因网络延迟导致 Controller 尚未绑定,从而引发空指针错误。

场景2:ASC 在 PlayerState 上

  • 服务器端:仍在 PossessedBy 中调用
    • PlayerState 在服务器端始终存在,且当 Controller 接管 Pawn 时,PlayerState 已与 Controller 关联。
    • 此时需将 ASC 的 OwnerActor 设为 PlayerStateAvatarActor 设为 Pawn
  • 客户端:在 OnRep_PlayerState 中调用
    • 客户端的 PlayerState 是服务器通过网络复制的,可能不会立即同步到客户端。
    • PlayerState 完成复制并触发 OnRep_PlayerState 回调时,才能安全访问它,从而正确绑定 OwnerActorPlayerState

2. AI 控制角色(AI-Controlled)

场景:ASC 在 Pawn 上

  • 服务器和客户端:均在BeginPlay中调用
    • AI 控制的角色通常没有复杂的 Controller 绑定流程(如玩家角色的网络同步)。
    • AI 的 ControllerPawn 生成时(BeginPlay)就已存在,无需等待 PossessedBy 事件。
    • BeginPlay 中直接初始化 ASC,可确保 AI 的技能系统立即生效,避免逻辑延迟。