Init Ability Actor Info
OwnerActor 与 AvatarActor

ASC (AbilitySystemComponent) 需要知道自己是在对谁起作用,以及是谁控制着自己,OwnerActor 是逻辑上拥有此组件的 actor。AvatarActor 是我们正在对其执行操作的物理 actor。通常是一个 Pawn,但它也可能是塔、建筑、炮塔等,可能与 Owner 相同。
- 对于 AI 控制的角色,如
Enemy Character,一般是把 ASC 放在 Pawn(Character)上,所以OwnerActor与AvatarActor都是Enemy Character - 对于玩家控制的角色,可能会将 ASC 放在 Pawn(Character) 上或者 PlayerState 上,对于后者,
OwnerActor就变成了 PlayerState,AvatarActor依旧还是 Pawn(Character)
InitAbilityActorInfo 这个函数就是用来初始化这两个信息,对于不同的情况,初始化的时机也不相同
InitAbilityActorInfo 调用时机

1. 玩家控制角色(Player-Controlled)
场景1:ASC 在 Pawn 上
- 服务器端:在
PossessedBy中调用- 当服务器端的
Controller接管(Possess)一个Pawn时,PossessedBy事件触发。此时Pawn已被绑定到Controller - 此时初始化 ASC 可确保服务器端的技能权限(如技能冷却、效果应用)正确关联到
Pawn。
- 当服务器端的
- 客户端:在
AcknowledgePossession中调用- 客户端需要等待服务器确认
Possession完成(通过AcknowledgePossession),此时客户端的Pawn和Controller已准备就绪。 - 若在客户端过早调用(如
BeginPlay),可能因网络延迟导致Controller尚未绑定,从而引发空指针错误。
- 客户端需要等待服务器确认
场景2:ASC 在 PlayerState 上
- 服务器端:仍在
PossessedBy中调用PlayerState在服务器端始终存在,且当Controller接管Pawn时,PlayerState已与Controller关联。- 此时需将 ASC 的
OwnerActor设为PlayerState,AvatarActor设为Pawn。
- 客户端:在
OnRep_PlayerState中调用- 客户端的
PlayerState是服务器通过网络复制的,可能不会立即同步到客户端。 - 当
PlayerState完成复制并触发OnRep_PlayerState回调时,才能安全访问它,从而正确绑定OwnerActor为PlayerState。
- 客户端的
2. AI 控制角色(AI-Controlled)
场景:ASC 在 Pawn 上
- 服务器和客户端:均在
BeginPlay中调用- AI 控制的角色通常没有复杂的
Controller绑定流程(如玩家角色的网络同步)。 - AI 的
Controller在Pawn生成时(BeginPlay)就已存在,无需等待PossessedBy事件。 - 在
BeginPlay中直接初始化 ASC,可确保 AI 的技能系统立即生效,避免逻辑延迟。
- AI 控制的角色通常没有复杂的

OωO