안선생의 개발 블로그

[UE5] RPC 본문

언리얼/멀티플레이

[UE5] RPC

안선생 2023. 11. 4. 21:24

RPC란?

RPC (Remote Procedure Call) 는 로컬에서 호출되지만 (호출하는 머신과는) 다른 머신에서 원격 실행되는 함수를 말합니다.  이를 사용하여 멀티플레이어 게임에서 서버와 클라이언트 간의 통신이 가능하며, 이를 통해 다양한 게임 이벤트와 상호작용을 구현할 수 있습니다. 

RPC는 함수를 보내고 유일하게 클라이언트에서 서버한테 정보를 보낼 수 있는 방법이기도 합니다!!

 

RPC 사용하는곳

멀티플레이어 게임: 여러 플레이어가 함께 플레이하는 게임에서 서버와 클라이언트 간에 상호작용이 필요한 경우 사용됩니다.

게임 이벤트 및 상태 동기화: 서버에서 일어난 게임 이벤트나 상태 변경을 클라이언트에 전달하여 게임 상태를 동기화할 때 사용됩니다.

유저 입력 처리: 클라이언트에서 발생한 유저 입력을 서버로 전달하여 다른 플레이어들과 공유할 때 사용됩니다.

 

RPC 사용하기

함수를 RPC 로 선언하려면 UFUNCTION 선언에 Server, Client, NetMulticast 키워드를 붙여주기만 하면 됩니다.

예를 들어 함수를 서버에서 호출되지만 클라이언트에서 실행되는 RPC 로 선언하려면, 이렇게 합니다:

 

UFUNCTION( Client )
void ClientRPCFunction();

함수를 클라이언트에서 호출되지만 서버에서 실행되는 RPC 로 선언하는 것은 Server 키워드를 사용한다는 것 빼고는 매우 비슷합니다:

UFUNCTION( Server )
void ServerRPCFunction();

Multicast 라 불리는 특수 유형 RPC 함수가 하나 더 있습니다. Multicast RPC 는 서버에서 호출된 다음 서버는 물론 현재 연결된 모든 클라이언트에서도 실행되도록 고안된 것입니다. 멀티캐스트 함수를 선언하려면 그냥 NetMulticast 키워드를 사용하면 됩니다:

UFUNCTION( NetMulticast )
void MulticastRPCFunction();

멀티캐스트 RPC 는 클라이언트에서도 호출 가능하지만, 이 경우 로컬에서만 실행됩니다.

 

  • Server RPC: 클라이언트에서 호출되어 서버에서 실행되는 함수입니다. 예를 들어, 클라이언트에서 어떤 동작을 요청하면 서버에서 해당 동작을 처리하는 함수가 서버 RPC로 구현될 수 있습니다.
  • Client RPC: 서버에서 호출되어 특정 클라이언트에서 실행되는 함수입니다. 다른 클라이언트에는 영향을 주지 않고 특정 클라이언트의 동작을 수행하려고 할 때 사용됩니다.
  • Multicast RPC: 서버에서 호출되어 모든 클라이언트에서 실행되는 함수입니다. 주로 게임 이벤트를 모든 플레이어에게 브로드캐스트하고 싶을 때 사용됩니다.

 

주의사항

  1. Actor 에서 호출되어야 합니다.
  2. Actor 는 빈드시 replicated 여야 합니다.
  3. 서버에서 호출되고 클라이언트에서 실행되는 RPC 의 경우, 해당 Actor 를 실제 소유하고 있는 클라이언트에서만 함수가 실행됩니다.
  4. 클라이언트에서 호출되고 서버에서 실행되는 RPC 의 경우, 클라이언트는 RPC 가 호출되는 Actor 를 소유해야 합니다.
  5. Multicast RPC 는 예외입니다:
    • 서버에서 호출되는 경우, 서버에서는 로컬에서 실행될 뿐만 아니라 현재 연결된 모든 클라이언트에서도 실행됩니다.
    • 클라이언트에서 호출되는 경우, 로컬에서만 실행되며, 서버에서는 실행되지 않습니다.
    • 현재 멀티캐스트 이벤트에 대해 단순한 스로틀 조절 메카니즘이 있습니다. 멀티캐스트 함수는 주어진 액터의 네트워크 업데이트 기간동안 두 번 이상 리플리케이트되지 않습니다. 장기적으로 크로스 채널 트래픽 관리 및 스로틀 조절 지원을 개선시킬 계획입니다.

 

서버에서 호출된 RPC

액터 소유권리플리케이트 안됨NetMulticast서버클라이언트

 

액터 소유권 리플리케이트 안됨 NetMulticast 서버 클라이언트
클라이언트 소유 액터 서버에서 실행 서버와 모든 클라이언트에서 실행 서버에서 실행 액터의 소유 클라이언트에서 실행
서버 소유 액터 서버에서 실행 서버와 클라이언트에서 실행 서버에서 실행 서버에서 실행
미소유 액터 서버에서 실행 서버와 모든 클라이언트에서 실행 서버에서 실행 서버에서 실행

클라이언트에서 호출된 RPC

액터 소유권리플리케이트 안됨NetMulticast서버클라이언트

액터 소유권 리플리케이트 안됨 NetMulticast 서버 클라이언트
호출하는 클라이언트에 소유 호출하는 클라이언트에서 실행 호출하는 클라이언트에서 실행 서버에서 실행 호출하는 클라이언트에서 실행
다른 클라이언트에 소유 호출하는 클라이언트에서 실행 호출하는 클라이언트에서 실행 드롭됨 호출하는 클라이언트에서 실행
서버 소유 액터 호출하는 클라이언트에서 실행 호출하는 클라이언트에서 실행 드롭됨 호출하는 클라이언트에서 실행
미소유 액터 호출하는 클라이언트에서 실행 호출하는 클라이언트에서 실행 드롭됨 호출하는 클라이언트에서 실행

 

 

신뢰성

기본적으로 RPC 는 비신뢰성입니다. RPC 호출이 원격 머신에서 확실히 실행되도록 하기 위해서는 Reliable 키워드를 붙이면 됩니다:

UFUNCTION( Client, Reliable )
void ClientRPCFunction();

 

  1. Reliable RPC:
    • 신뢰성 있는 RPC는 가장 높은 신뢰성 수준을 가집니다.
    • 이 RPC는 메시지 손실 또는 순서 교환을 처리하여 메시지가 목적지에 도달하고 원하는 순서로 처리될 것을 보장합니다.
    • 주로 게임 상태와 관련된 중요한 정보를 전송하는 데 사용됩니다.
    • 상당한 대역폭을 필요로 하며, 데이터 손실을 피하고 신뢰성 있는 통신이 필요한 경우에 사용됩니다. 예를 들어, 플레이어의 캐릭터 위치 업데이트 등.
  2. Unreliable RPC:
    • 이 RPC는 메시지의 손실이나 순서 교환이 덜 신뢰성 있게 처리될 수 있는 경우에 사용됩니다.
    • 예를 들어, 채팅 메시지와 같은 게임 상태와 크게 상관없는 정보를 전송할 때 사용됩니다.
    • 빠른 속도와 낮은 대역폭 요구 사항을 가지며, 데이터 손실이 허용되는 경우에 사용됩니다. 예를 들어, 총알 발사 이벤트 등.

즉 신뢰할 수 있는 RPC는 틱 함수를 보내는 것이 아니라 무기를 무장하는 것 같은 일회성 행동들을 보내는 것입니다.

 

 

 

아래 공식문서에서 더 많은 정보를 확인할 수 있습니다.

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/RPCs/

 

RPC

네트워크를 통한 함수 리플리케이션 지정하기 입니다.

docs.unrealengine.com