ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UE5] RPC(Remote Procedure Call)
    UE5 2024. 12. 17. 05:45

    RPC(Remote Procedure Call)이란?

    • 원격 프로시저(함수) 호출의 약자
    • 원격 컴퓨터에 있는 함수를 호출할 수 있도록 만든 통신 프로토콜
    • 네트워크 멀리플레이에서 서버와 클라이언트간에 빠르게 행동을 명령하고 정보를 주고받는데 사용
    • 언리얼 엔진에서 클라이언트에서 서버로 통신하는 유일한 수단 제공
    • 속성형 장식이나 휘발성인 비신뢰성 게임플레이를 위한 것(사운드 재생, 파티클 스폰 등) 액터의 핵심적인 기능과는 무관한 일시적 효과와 같은 작업을 하는 이벤트를 처리

     

    Client RPC

    • 서버에서 클라이언트로 호출하는 RPC
    • 이를 활용해 특정 클라이언트에게만 명령을 보낼 수 있음
    • 서버에서 명령을 보낼 클라이언트의 커넥션을 소유한 액터를 사용해야 함(AActor::GetNetConnection)
    • 대부분의 경우 서버, 클라이언트의 두 액터는 모두 플레이어 컨트롤러
    • 클라이언트의 경우는 특별한 autonomous proxy역할을 가진 플레이어 컨트롤러 액터
    • 반드시 전달되어야하는 명령이 아니라면 가급적 Unreliable 속성을 사용하는 것이 좋음
    // Server
    UFUNCTION(Client, Unreliable)
    ClientRPCFunction()
    
    // Client
    ClientRPCFunction_Implementation()

     

    Server RPC

    • 클라이언트에서 서버로 호출하는 RPC
    • 언리얼 엔진 구조에서 유일하게 클라이언트가 서버의 함수를 호출 할 수 있는 기능
    • 서버쪽에서 클라이언트의 명령을 검증할 수 있는 함수를 구현할 수 있음
    • Client RPC와 동일하게 서버와의 커넥션을 소유한 액터를 사용해야 함
    • 서버 RPC에는 WithValidation이라고 하는 클라이언트가 보낸 명령이 악의적인 것인지 판단하는 키워드 사용
    // Server
    ServerRPCFunction_Validate()
    ServerRPCFunction_Implemetation()
    
    // Client
    UFUNCTION(Server, Unreliable, WithValidation)
    ServerRPCFunction()

     

    NetMulticast RPC

    • 서버를 포함해 모든 플레이어에게 명령을 보내는 RPC
    • 프로퍼티 리플리케이션과 유사하게 연관성 기반으로 동작함(커넥션을 소유하지 않아도 동작)
    • 프로퍼티 리플리케이션과 유사하지만 다른 용도로 사용
    // Server
    UFUNCTION(NetMulticast, Unreliable)
    MulticastRPCFunction()
    MulticastRPCFunction_Implementation()
    
    // Client1
    MulticastRPCFunction_Implementation()
    
    // Client2
    MulticastRPCFunction_Implementation()

     

    키워드 정리

    • Unreliable : RPC 호출을 보장하지 않는 옵션. 빠름
      • 데이터 전송을 보장하지 않지만 빠르게 계속 보낼 수 잇어 움직임에 필요한 데이터를 빈번하게 전달함으로써 부드러운 움직임을 구현할 수 있도록 도와줌
    • Relialbe : RPC 호출을 보장해주는 추가 옵션. 정말 필요한 때만 호출
      • 데이터 전송을 보장하기 위해서 내부적으로 보낸 패킷이 잘 도착했는지 서로 확인하는 작업 필요
    • WithValidation : 서버에서 검증 로직을 추가로 구현할 때 추가하는 옵션
      • 문법적으로는 모든 RPC에 사용이 가능하지만 실질적으로 서버 RPC에서만 사용
      • 왜냐하면 서버 RPC만이 RPC를 호출한 결과가 서버에서 구동되기 때문
Designed by Tistory.