해당 포스팅에서는 언리얼 RPC를 사용할 때, Owner를 설정하는 과정의 중요성을 쓰려한다.
RPC는 서버와 클라이언트가 내부 메소드를 서로의 로컬에서 실행한 것 처럼 송신자가 수신자의 함수를 호출하도록 요청하는 것을 의미한다.
이미지 출처 (https://www.ibm.com/docs/en/aix/7.1?topic=call-rpc-model)
이미지로 볼 수 있듯이 RPC 통신에서는 stub에서 메소드 호출을 Proto, JSON의 형태의 메시지로 변경하는 과정이 필요하고 이 과정에서 직렬화와 네트워크 전송으로 인해 속도 저하가 발생할 수 있다.
이러한 RPC 통신 체계속에서 언리얼의 Owner 설정에 대해서 알아보려한다.
기본적으로 Client는 게임에서 자신의 PlayerController를 통해 게임 세션에 참여한다. 따라서 기본적으로 Controller를 클라이언트 자체라고 표현할 수도 있을 것이다.
Controller에서 Possess메소드를 호출하면 Character를 Controller의 소유로 만들게 된다. 내부 코드는 아래와 같다.
void APawn::PossessedBy(AController* NewController)
{
SetOwner(NewController);
...
}
Possess하는 대상 Pawn을 SetOwner메소드를 사용하여 Owner로 설정한다.
ActorComponent는 기본적으로 자신이 속한 Actor의 소유권을 따른다. 즉, ActorComponent를 가진 Actor가 특정 Controller에 의해 소유된다면, 그 ActorComponent도 해당 Controller의 소유로 간주된다. 이는 ActorComponent를 사용하는 주요한 이유중 하나일 것이다.
위에서는 일반적인 경우의 것들을 살펴봤는데, 중요한 것은 SetOwner메소드를 통해서 RPC 호출의 대상이 되는 클라이언트는 해당 객체의 소유자(Owner)에 따라 달라지게 된다.
정확한 소유자 설정 없이는 클라이언트가 서버로부터 특정 데이터를 수신하거나 RPC 메소드를 호출할 수 없다.
따라서 게임에서 각 객체의 소유권을 명확하게 설정하는 것이 중요할 것이다.