언리얼엔진5 공부

RPC(Remote Procedure Call)

Client Side 2025. 11. 19. 22:06

개념

  • 다른 컴퓨터에 있는 함수를 호출하는 것.

RPC의 종류

  • Server RPC (클라이언트 → 서버)
    • 키워드: Server (예: UFUNCTION(Server, Reliable) void Server_Shoot();)
    • 호출, 실행 : 클라이언트가 호출하면 서버에서 실행된다.
    • 목적 : 클라이언트의 입력을 서버로 전달하여 중요한 게임 로직을 서버에서 처리하도록 요청할 때 사용.
    • 주의 : 오직 해당 Actor를 소유(Owning)하고 있는 클라이언트만 호출 할 수 있다.
  • Client RPC (서버 → 클라이언트)
    • 키워드: Client (예: UFUNCTION(Client, Reliable) void
    • 호출, 실행 : 서버가 호출하면 해당 클라이언트에서만 실행된다.
    • 목적 : 서버에서 발생한 특정 이벤트를 오직 특정 한 명의 클라이언트에게만 전달하여, 그 클라이언트에서 시각적/청각적 효과 등을 재생하거나 UI를 업데이트할 때 사용한다. (예: 개인 채팅 메시지, 점수 업데이트)
  • NetMulticast RPC (서버 → 모든 클라이언트)
    • 키워드: NetMulticast (예: UFUNCTION(NetMulticast, Reliable) void NetMulticast_PlayExplosionEffect();)
    • 호출, 실행 : 서버가 호출하면 모든 연결된 클라이언트들에서 실행된다. 그리고 서버 자체에서도 해당 함수가 실행 될 수 있다.
    • 목적 : 모든 플레이어가 봐야 하는 전역적인 게임 이벤트 (예: 폭발, 게임 시작 카운트다운, 환경 변화 등)를 모든 클라이언트에 동시에 전달하여 동일한 시각/청각 효과 등을 재생할 때 사용한다.
    • 주의 : 서버에서도 이 함수가 실행되는 경우가 있기 때문에, 서버에서만 실행되어야 하는 로직은 따로 GetLocalRole == ROLE_Authority 체크 해주면 좋다.

RPC의 속성

  • Reliable vs Unreliable
    • Reliable(신뢰성)
      • 이 RPC는 반드시 상대방에게 전달됨을 보장한다. 패킷이 유실되면 재전송을 시도해서 결국에는 도착하도록 만든다. 중요한 게임 상태 변경에는 필수적이다. 하지만 네트워크 부하가 더 크다.
    • Unreliable(비신뢰성)
      • 이 RPC는 전달됨을 보장하지 않는다. 패킷이 유실되면 재전송을 시도하지 않고 그냥 유실된다. 주로 빈번하게 호출되지만 잠깐 유실돼도 큰 문제가 없는 정보(캐릭터의 위치/회전 업데이트처럼 연속적인 데이터)에 사용된다. 네트워크 부하가 적다.
    • 기본값 : Inreliable이 기본값이므로, 중요한 RPC는 반드시 Reliable을 명시해야 한다.
  • WithValidation
    • Server RPC에 주로 사용되는데, 클라이언트가 비정상적인 값으로 RPC를 호출하거나 치팅을 시도하는지 유효성 검사를 할 수 있도록 해준다.
    • WithValidation을 붙이면 언리얼이 자동으로 _Validate와 _Implementation 함수를 만들어야 한다고 알려준다. _Validate 함수에서는 전달받은 인자들이 유효한지 검사하고, 유효하지 않으면 연결을 끊거나 에러를 발생시켜 치팅을 방지할 수 있다.

RPC 사용 시 중요한 점

  • 권한 확인
    • Server RPC는 액터를 소유하고 있는 클라이언트만이 호출할 수 있다. AController와 APawn(ACharacter)는 자동으로 소유 관계가 설정된다.
    • Client RPC와 NetMulticast RPC는 오직 서버에서만 호출할 수 있다.
    • 항상 if (GetLocalRole() == ROLE_Authority) (서버에서만 실행) 또는 if (GetOwner() && GetOwner()->IsLocallyControlled()) (로컬 플레이어의 클라이언트에서만 실행) 같은 체크를 먼저 하는 습관을 들이는 것이 중요하다
  • 데이터 전달
    • RPC는 함수이기 때문에 매개변수를 통해 데이터를 전달할 수 있다. 하지만 너무 큰 데이터를 보내거나 너무 자주 RPC를 호출하면 네트워크 부하가 심해지니 조심해야 한다.
  • 상태 변경은 RepNotify를 선호
    • 단순한 변수(체력, 점수 등)의 상태 변경은 RPC보다는 변수 복제(Replicated)와 RepNotify를 사용하는 것이 더 효율적이고 권장된다. RPC는 ‘이벤트 또는 즉각적인 액션’을 전달하는 데 사용하고, Replicated 변수는 ‘지속적인 상태’를 동기화하는 데 사용한다.
  • 구현 시 cpp 함수명 뒤에 _Implementation이 붙어야 한다.

'언리얼엔진5 공부' 카테고리의 다른 글

숫자야구_숫자 로직  (0) 2025.11.21
Property Replication  (1) 2025.11.20
ENetMode  (0) 2025.11.18
디버깅  (0) 2025.11.17
CDO (Class Default Object)  (0) 2025.11.16