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 控制的角色通常没有复杂的