안선생의 개발 블로그
[UE5] RPC 본문
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: 서버에서 호출되어 모든 클라이언트에서 실행되는 함수입니다. 주로 게임 이벤트를 모든 플레이어에게 브로드캐스트하고 싶을 때 사용됩니다.
주의사항
- Actor 에서 호출되어야 합니다.
- Actor 는 빈드시 replicated 여야 합니다.
- 서버에서 호출되고 클라이언트에서 실행되는 RPC 의 경우, 해당 Actor 를 실제 소유하고 있는 클라이언트에서만 함수가 실행됩니다.
- 클라이언트에서 호출되고 서버에서 실행되는 RPC 의 경우, 클라이언트는 RPC 가 호출되는 Actor 를 소유해야 합니다.
- Multicast RPC 는 예외입니다:
- 서버에서 호출되는 경우, 서버에서는 로컬에서 실행될 뿐만 아니라 현재 연결된 모든 클라이언트에서도 실행됩니다.
- 클라이언트에서 호출되는 경우, 로컬에서만 실행되며, 서버에서는 실행되지 않습니다.
- 현재 멀티캐스트 이벤트에 대해 단순한 스로틀 조절 메카니즘이 있습니다. 멀티캐스트 함수는 주어진 액터의 네트워크 업데이트 기간동안 두 번 이상 리플리케이트되지 않습니다. 장기적으로 크로스 채널 트래픽 관리 및 스로틀 조절 지원을 개선시킬 계획입니다.
서버에서 호출된 RPC
액터 소유권리플리케이트 안됨NetMulticast서버클라이언트
액터 소유권 | 리플리케이트 안됨 | NetMulticast | 서버 | 클라이언트 |
클라이언트 소유 액터 | 서버에서 실행 | 서버와 모든 클라이언트에서 실행 | 서버에서 실행 | 액터의 소유 클라이언트에서 실행 |
서버 소유 액터 | 서버에서 실행 | 서버와 클라이언트에서 실행 | 서버에서 실행 | 서버에서 실행 |
미소유 액터 | 서버에서 실행 | 서버와 모든 클라이언트에서 실행 | 서버에서 실행 | 서버에서 실행 |
클라이언트에서 호출된 RPC
액터 소유권리플리케이트 안됨NetMulticast서버클라이언트
액터 소유권 | 리플리케이트 안됨 | NetMulticast | 서버 | 클라이언트 |
호출하는 클라이언트에 소유 | 호출하는 클라이언트에서 실행 | 호출하는 클라이언트에서 실행 | 서버에서 실행 | 호출하는 클라이언트에서 실행 |
다른 클라이언트에 소유 | 호출하는 클라이언트에서 실행 | 호출하는 클라이언트에서 실행 | 드롭됨 | 호출하는 클라이언트에서 실행 |
서버 소유 액터 | 호출하는 클라이언트에서 실행 | 호출하는 클라이언트에서 실행 | 드롭됨 | 호출하는 클라이언트에서 실행 |
미소유 액터 | 호출하는 클라이언트에서 실행 | 호출하는 클라이언트에서 실행 | 드롭됨 | 호출하는 클라이언트에서 실행 |
신뢰성
기본적으로 RPC 는 비신뢰성입니다. RPC 호출이 원격 머신에서 확실히 실행되도록 하기 위해서는 Reliable 키워드를 붙이면 됩니다:
UFUNCTION( Client, Reliable )
void ClientRPCFunction();
- Reliable RPC:
- 신뢰성 있는 RPC는 가장 높은 신뢰성 수준을 가집니다.
- 이 RPC는 메시지 손실 또는 순서 교환을 처리하여 메시지가 목적지에 도달하고 원하는 순서로 처리될 것을 보장합니다.
- 주로 게임 상태와 관련된 중요한 정보를 전송하는 데 사용됩니다.
- 상당한 대역폭을 필요로 하며, 데이터 손실을 피하고 신뢰성 있는 통신이 필요한 경우에 사용됩니다. 예를 들어, 플레이어의 캐릭터 위치 업데이트 등.
- Unreliable RPC:
- 이 RPC는 메시지의 손실이나 순서 교환이 덜 신뢰성 있게 처리될 수 있는 경우에 사용됩니다.
- 예를 들어, 채팅 메시지와 같은 게임 상태와 크게 상관없는 정보를 전송할 때 사용됩니다.
- 빠른 속도와 낮은 대역폭 요구 사항을 가지며, 데이터 손실이 허용되는 경우에 사용됩니다. 예를 들어, 총알 발사 이벤트 등.
즉 신뢰할 수 있는 RPC는 틱 함수를 보내는 것이 아니라 무기를 무장하는 것 같은 일회성 행동들을 보내는 것입니다.
아래 공식문서에서 더 많은 정보를 확인할 수 있습니다.
https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/RPCs/
RPC
네트워크를 통한 함수 리플리케이션 지정하기 입니다.
docs.unrealengine.com
'언리얼 > 멀티플레이' 카테고리의 다른 글
[UE5] 언리얼 자체 리플리케이션?? (1) | 2023.11.05 |
---|---|
[UE5] 변수 리플리케이션 (0) | 2023.11.03 |
[UE5] Network Role (0) | 2023.11.01 |
[UE5]멀티플레이 클라이언트와 서버 관계 (0) | 2023.10.30 |
[UE5] 멀티플레이 Seamless Travel (3) | 2023.10.29 |