Replication Mode는 언리얼 엔진에서 서버가 클라이언트를 업데이트하는 방식을 정의합니다.
함수 SetReplicationMode를 통해 이 방식을 결정할 수 있고,
인자는 구조체 EGameplayEffectReplicationMode의 멤버를 사용합니다.
1) EGameplayEffectReplicationMode
이 구조체의 멤버는 총 3가지로 구분할 수 있습니다.
이는 설명드리기보다는 그림으로서 한번에 보는 것이 나을 것이라 생각합니다.
위와 같이 정리할 수 있습니다.
프로젝트에 이를 적용해보면
AuraPlayerState의 ASC는 플레이어가 조종하므로 Mixed를 적용하면 될 것이고,
AuraEnemy의 ASC는 AI가 조종하므로 Minimal을 적용하면 될 것입니다.
2) InitActorInfo 함수
ASC의 경우 InitActorInfo 함수를 통해 OwnerActor와 AvatarActor를 결정해줘야 합니다.
이때 OwnerActor는 말 그대로 ASC를 소유하고 있는 Actor를 일컫고
AvatarActor는 월드에서 ASC를 소유하고 있는 Actor를 의미합니다.
이때 InitAbilityActorInfo 함수를 호출하는 시점은 Controller가 Pawn에 완전히 정착한 시점이어야 할것입니다.
AuraEnemy에서 ASC의 OwnerActor와 AvatarActor는 모두 AuraEnemy입니다.
그러나 AuraPlayerState에서 ASC의 OwnerActor는 AuraPlayerState이지만 AvatarActor는 AuraPlayer입니다.
AI가 조종하는 캐릭터의 경우는 다음의 시점에서 InitAbilityActorInfo 함수를 호출하면됩니다.
만약 ASC가 Pawn에 있는 경우 Server와 Client 모두 BeginPlay 시점에서 호출하면 됩니다.
그러나 플레이어가 조종하는 캐릭터의 경우 경우를 2개로 나누어 생각할 수 있습니다.
만약 ASC가 Pawn에 있다면
Server는 PossessedBy 함수 시점에서 호출하면되지만
Client의 경우 AcknowledgePossession 함수 시점에서 호출하면 됩니다.
이제 만약 ASC가 PlayerState에 있는 경우를 생각해보면
Server는 동일하게 PossessedBy 함수 시점에서 호출하면 되지만,
Client의 경우 OnRep_PlayerState 함수 시점에서 호출하면 됩니다.
따라서 프로젝트의 경우에는 OnRep_PlayerState 함수를 오버라이드하도록 하겠습니다.
3) ReplicationMode가 Mixed일때의 주의사항
추가적으로 Replication Mode가 Mixed일때의 주의사항을 간단히 정리해보겠습니다.
Mixed 상태일 경우, 플레이어가 조종하므로 OwnerActor는 반드시 Controller일 것입니다.
이는 Pawn의 PossessedBy() 함수에 의해 자동적으로 이뤄집니다.
그리고 플레이어의 OwnerActor가 바뀌었으니 PlayerState의 OwnerActor도 Controller가 될것입니다.
따라서 만약 OwnerActor가 PlayerState가 아닌 상태에서 Mixed로 Replication Mode를 설정하는 경우에는
반드시 SetOwner() 함수를 통해 Controller를 OwnerActor로 설정해줘야 합니다.