공격 기능 & Damage예제 / 액터 컴포넌트 리플리케이션- Unreal Network MultiPlayer Framework
Attack 기능은 기본적으로 제작되었다는 가정 하에 Network 흐름을 연습하기 위한 예제이다.
h 파일에 Lifetime을 위한 GetLifetimeReplicatedProps와 Server, MulticastRPC를 만들어준다.
그리고 bCanAttack을 콜백함수로 구현하기 위해 ReplicatedUsing을 사용하고 OnRep_CanAttack()함수를 만들어준다.
Attack은 Attack을 수행하는 함수이고 AttackHitCheck는 Attack시 다른 캐릭터가 맞았는지 체크하는 함수이다.
GetLifetimeReplicatedProps에 bCanAttack 네트워크를 통해 통신하기 위해서 DOREPLIFETIME 매크로를 통해 등록해준다.
bCanAttack이 true라면 클라이언트에서 ServerRPC를 실행하고 ServerRPC에선 MulticastRPC를 실행한다.
MulticastRPCAttack이다. 여기선 서버에서만 공격이 가능한지 확인하기 위해서 HasAuthority()를 통해 상태를 바꾼다.
해당 함수 가장 아래에서 Montage를 실행해서 공격을 실행하기에 중복 공격을 피하기 위해 bCanAttack = false로 한다.
그리고 OnRep_CanAttack을 명시적으로 호출하여 Attack 시 움직임을 제어할 수 있도록 한다.
(OnRep_CanAttack을 명시적으로 호출하지 않으면 Attack시 움직인다.)
AttackTime만큼 시간이 흐르면 자동으로 Attack 가능하도록 바꾸고
OnRep_CanAttack()을 호출하여 CanAttack 프로퍼티를 리플리케이션 해준다.
여기까지 진행하면 Attack가 Hit되서 맞지만 클라이언트에서 HP가 깎여서 HP Bar에 나타나거진 않는다.
이때는 Actor 컴포넌트 리플리케이션(Actor Component Replication)을 사용해야한다.
액터 컴포넌트 리플리케이션 (Actor Component Replication)
- Unreal에서 리플리케이션 주체는 Actor이다.
하지만 Actor가 소유하는 Unreal Object (Subobject)에 대해 리플리케이션이 진행 가능하다.
액터 컴포넌트 리플리케이션 방법
- Actor 컴포넌트의 생성자에서 SetIsReplicated()라는 함수에 true값을 전달하려 리플리케이션 활성화한다.
- Unreal Engine에서 InitializeComponent() 이후에 ReadyForReplication()이라는 함수를 준비가 될 때 자동으로 호출한다.
ReadyForReplication() 이후에 Player Pawn의 BeginPlay가 실행된다. (실행 순서는 PostNetInit()과 유사함)
이제 HP 예제이다.
HP를 관리하는 컴포넌트의 생성자말고 InitializeComponent()에서 다음과 같이 SetIsReplicated(true)를 전달해준다.
이렇게 작성하면 해당 Actor 컴포넌트는 리플리케이션 될 준비가 되었다고 알리는 것이다.
GetLifetimeReplicationProps를 통해 CurrentHP는 네트워크를 통신에 활용된다고 알려준다.
이후 CurrentHP가 변화하면 서버와 클라이언트 모두 적용이 된다.