RPC ( Remote Procedure Call )
개념
- 일반적으로 클라이언트와 서버는 서로 다른 메모리 공간과 실행 환경을 가지고 있음
- RPC는 네트워크 환경에서 서버와 클라이언트가 함수 호출을 동기화하는 메커니즘
- 즉, 호출하는 PC와 실행하는 PC가 달라도 되게끔 해주는 통신 기법
동작 원리
- RPC는 패킷 단위로 직렬화되어 네트워크를 통해 전송됨
- 서버나 클라이언트가 해당 객체의 NetDriver와 Channel을 통해 호출 정보를 받음
- 언리얼 네트워크 레이어가 함수 시그니처를 확인하고 해당 객체에 함수를 실행시킴
RPC 종류
1. NetMulticast
- 서버 -> 모든 클라이언트에게 브로드캐스트 호출
- 예 : 서버가 "폭발 발생" 처리 -> 모든 클라이언트가 같은 이펙트 재생
2. Server
- 클라이언트 -> 서버로 요청을 보낼 때 사용
- 예 : 클라이언트가 "총을 발사했다" 입력 -> 서버에서 총알 스폰 처리
3. Client
- 서버 -> 특정 클라이언트에게 호출
- 예 : 서버가 "보스가 공격한다" -> 해당 클라이언트 화면에 이펙트 보여주기
RPC의 다양한 케이스
Call vs Invoke
- Call
- 정적인 의미를 가짐
- 컴파일 타임에 어떤 함수인지, 호출하는 곳과 실행하는 곳이 정해져야 함
- 직접적으로 함수를 호출하고 실행해야 함 (Direct)
- Invoke
- 동적인 의미를 가짐
- 런타임에 어떤 함수인지, 호출하는 곳과 실행하는 곳이 어딘지 정해짐
- 함수 포인터, 동적 바인딩, RPC 같은 개념들이 해당됨
- 간접적으로 함수를 호출하고 실행해야 함 (Indirect)
다양한 케이스들

- Actor ownership
- 네트워크 멀티플레이가 적용되려면, 액터는 서버에서 스폰되고,
bReplicated가 true여야 함
- Client-owned actor :
PlayerController가 Local PlayerController와 같은 경우
- 서버에서 스폰된 후
SetOwner(PlayerController) 함수를 호출해야 Client-Owned-Actor가 됨
- Owned by different client :
PlayerController가 Local PlayerController와 다른 경우
- Server-owned actor : 서버에서 스폰되었지만
SetOwner() 함수 호출이 없는 경우
NetMulticast, Server, Client : 해당 PC에서 스폰해달라는 키워드
- 자주 쓰이는 케이스들
- RPC가 클라이언트에서 호출되고 서버에서 실행되어야 하는 경우 (
Server 키워드)
ClientConnection이 소유하고 있는 액터에서 RPC가 호출되어야 함
_Validate() 함수에서 RPC를 실행할지 말지 결정
- RPC가 서버와 모든 클라이언트에서 실행되어야 하는 경우 (
NetMulticast 키워드)
- 서버에서 호출해야 함
- 부하가 심하기 때문에, 빈번하게 호출되게 하는 코드는 안 됨
- RPC가 서버에서 호출되고 클라이언트에서 실행되어야 하는 경우 (
Client 키워드)
WithValidation
- 클라이언트 -> 서버로 보내는 Server RPC는 보안상 신뢰할 수 없음
- UE4 초반에 사용한 방법으로 서버에서 유효성 검증 함수를 자동으로 강제할 수 있음
_Implementation()과 _Validate() 함수 시그니처를 요구
_Validate()에서 클라이언트 요청이 정상인지 검사, _Implementation()에서 실제 RPC 동작
- 현재는 Deprecated되었고, 함수 안에서 직접 권한 확인과 유효성 체크를 함
Reliable vs Unreliable
- Reliable
- 신뢰성 무조건 보장 : RPC 호출이 반드시 도착하도록 엔진이 보장
- 순서 보장 : 먼저 보낸 것이 나중에 보낸 것보다 먼저 실행됨
- 사용하는 예시 : 중요한 동작 (무기 발사 요청, 캐릭터 스폰 등)
- 단점 : 패킷 손실이 발생하면, 다시 전송 -> 지연 발생 가능
- Unreliable
- 최대한 보냄 : 패킷이 손실되면 그냥 무시됨
- 순서 보장 X
- 장점 : 성능 효율적, 딜레이 누적 방지
- 사용하는 예시 : 자주 보내지만 중요하지 않은 동작 (캐릭터의 위치 업데이트, 총알 궤적 이펙트)
Property Replication
개념
- 멀티플레이 환경에서 서버의 변수 값을 클라이언트와 동기화하는 기능
- 서버가 Authority 상태에서 변수 값을 바꾸면, 엔진이 알아서 클라이언트로 전파함
동작 원리
UPROPERTY에 Replication 옵션을 주면, 서버에서 값이 바뀔 때마다 클라이언트에게 자동 동기화
- 복제는 패킷 최적화를 거쳐, 바뀐 값만 전송됨 (Delta Serialization)
설정 방법
- 액터의
bReplicates 속성을 true로 설정
- 네트워크로 복제할 액터의 속성에
Replicated 키워드 추가
GetLifetimeReplicatedProps() 함수에 네트워크로 복제할 속성 추가
DOREPLIFETIME 매크로를 사용해 복제할 속성을 명시
- 클라이언트에서 값이 갱신될 때 실행되는 콜백을 붙일 수도 있음 (
ReplicatedUsing 키워드)
- 특정 조건에서만 값이 복제되도록 할 수 있음 (
Cond 키워드)
출처 : 팀스파르타 내일배움캠프, 언리얼엔진 공식문서