언리얼 엔진5 Advanced - RPC 기초

타입·2025년 4월 3일

언리얼 강의

목록 보기
30/47

RPC 기초

RPC (Remote Procedure Call)

원격 프로시저(함수) 호출의 약자
원격 컴퓨터에 있는 함수를 호출할 수 있도록 만든 통신 프로토콜
네트워크 멀티플레이에서 서버와 클라이언트간에 빠르게 행동을 명령하고 정보를 주고받는데 사용
언리얼 엔진에서 클라이언트에서 서버로 통신하는 유일한 수단을 제공

버전 5.0부턴 UFUNCTION()에 Reliable/Unreliable 키워드를 필수로 넣어야 합니다.

Client RPC 개요

서버에서 클라이언트로 호출하는 RPC

이를 활용해 특정 클라이언트에게만 명령을 보낼 수 있음

서버에서 명령을 보낼 클라이언트의 커넥션을 소유한 액터를 사용해야 함 (AActor::GetNetConnection)

Server RPC 개요

클라이언트에서 서버로 호출하는 RPC

언리얼 엔진 구조에서 유일하게 클라이언트가 서버의 함수를 호출할 수 있는 기능

서버쪽에서 클라이언트의 명령을 검증할 수 있는 함수를 구현할 수 있음 (Validation)

Client RPC와 동일하게 서버와의 커넥션을 소유한 액터를 사용해야 함

NetMulticast RPC 개요

서버를 포함해 모든 플레이어에게 명령을 보내는 RPC

프로퍼티 리플리케이션과 유사하게 연관성 기반으로 동작함 (커넥션을 소유하지 않아도 동작)

프로퍼티 리플리케이션과 유사하지만 다른 용도로 사용

RPC 선언에 관련된 키워드 정리

  • Unreliable
    RPC 호출을 보장하지 않는 옵션, 빠름
  • Reliable
    RPC 호출을 보장해주는 추가 옵션, 비용이 발생하여 정말 필요할 때만 호출
  • WithValidation
    서버에서 검증 로직을 추가로 구현할 때 추가하는 옵션

  • GetNetConnection()
    오너십을 확인하는 방법
    Owner의 NetConnection을 반환
    Owner가 Pawn이라면 Controller의 NetConnection을 반환
    Owner가 PlayerController라면 Player가 있는지 확인 후 자신의 NetConnection을 반환

액터의 Owner를 PlayerController를 가진 Pawn으로 설정하거나, PlayerController로 설정하면 해당 액터는 오너십을 가짐

RPC 사용 시 주의할 점

비신뢰성 RPC는 의도한 목적지 도착이 보장되지 않지만, 신뢰성 RPC보다 더 자주, 더 빨리 전송할 수 있습니다. 비신뢰성 RPC는 게임플레이에 중요하지 않거나 매우 자주 호출되는 함수에 가장 적합합니다. 예를 들어, 액터 무브먼트는 프레임마다 변경될 수 있기 때문에 비신뢰성 RPC를 사용하여 리플리케이트됩니다.

신뢰성 RPC는 의도한 목적지 도착을 보장하며, 성공적으로 수신될 때까지 큐에 남아 있습니다. 신뢰성 RPC는 게임플레이에 중요하지만, 그렇게 자주 호출되지 않는 함수에 가장 적합합니다. 신뢰성 RPC의 예로는 콜리전 이벤트, 무기 발사 시작 또는 종료, 액터 스폰 등이 있습니다.

신뢰성 함수를 과도하게 사용하면 해당 함수의 큐가 오버플로우될 수 있습니다. 그러면 강제로 접속이 끊어집니다. 프레임 단위로 리플리케이티드 함수를 호출할 경우에는 함수를 비신뢰성으로 만들어야 합니다. 플레이어 입력에 바인딩된 신뢰성 함수가 있다면, 플레이어가 해당 함수를 호출할 수 있는 빈도를 제한해야 합니다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/networking-overview-for-unreal-engine#팁및추가자료
생성자에서 IsLocallyControlled() 함수 사용 주의, 아직 할당된 컨트롤러가 없는 상태

  • 각 RPC 종류마다 올바르게 사용할 것
    • Client, NetMulticast는 서버에서만 호출
    • Server는 클라이언트에서 호출하지만, 플레이어로 참여하는 리슨서버의 경우 호출 가능
    • Client, Server는 오너십을 가지고 있는 액터에서 호출
      컨트롤러: IsLocalController() 함수
      폰: IsLocallyControlled() 함수
      (서버에서 오너십이 없는 액터가 클라이언트 RPC 호출 시 오류가 발생하지 않고 그냥 서버에서 실행됨, 안전장치로 위 함수로 검사 추천)

Tick 및 빈번하게 호출되는 함수에 Reliable RPC를 사용하지 말 것

NetMulticast RPC의 잦은 사용은 네트워크 부하를 가중시키니 신중을 기할 것

게임 플레이 및 액터 상태에 영향을 미치는 경우 RPC보다 프로퍼티 리플리케이션을 사용할 것

RPC 종류에 따른 동작 표

항목에 따라 기획에 맞게 사용하고 있는지 인지하면서 개발하기
HasAuthority() 함수를 사용해 호출 지점에 대한 파악
IsLocalController() 또는 IsLocallyControlled() 함수를 사용해 오너십을 파악

프로퍼티 리플리케이션 vs NetMulticast RPC

  • 유사점
    서버와 모든 클라이언트의 지정한 함수를 호출할 수 있음
    지정한 데이터 전송을 보장할 수 있음
    액터의 오너십과 무관하게 연관성으로 동작함

  • 차이점
    프로퍼티 리플리케이션으로 설정한 데이터는 클라이언트에 반드시 동기화됨 (RPC 전송의 Reliability와 다른 개념)
    NetMulticast RPC를 호출한 타이밍에 클라이언트가 없으면 해당 데이터를 받을 길이 없음

  • 정리
    프로퍼티 리플리케이션은 게임에 영향을 미치는 데이터에 사용 (Gameplay Property)
    NetMulticast RPC는 게임과 무관한 휘발성 데이터에 사용 (Cosmetic)

실습코드

https://github.com/dnjfs/ArenaBattle_Network/commit/32d3e30709948555f18da500db4d8b9da6d98183

  • TActorRange< T >()
    원하는 타입의 액터를 모두 반환
profile
주니어 언리얼 프로그래머

0개의 댓글