본문 바로가기
언리얼엔진

언리얼 엔진5 RPC

by 대니스 2025. 3. 21.

RPC

정의

- RPC(Remote Procedure Call)는 로컬에서 호출되지만 (호출하는 머신과는)다른 머신에서 원격 실행되는 함수

용도

- transient or cosmetic 비신뢰성 게임플레이 이벤트를 위한 것 (이는 사운드 재생, 파티클 스폰, 액터의 핵심적인 기능과는 무관한 일시적 효과와 같은 작업을 하는 이벤트를 포함)

 

RPC 사용하기

// 함수를 서버에서 호출되지만 클라이언트에서 실행되는 RPC
UFUNCTION( Client )	
void ClientRPCFunction();

 

// 함수를 클라이언트에서 호출되지만 서버에서 실행되는 RPC
UFUNCTION( Server )	
void ServerRPCFunction();
// 서버에서 호출된 다음 서버와 현재 연결된 모든 클라이언트에서도 실행되도록 고안
UFUNCTION( NetMulticast )	
void MulticastRPCFunction();

 

요건 및 주의사항

1. Actor에서 호출되어야 한다

2. Actor는 반드시 replicated여야 한다

3. 서버에서 호출되고 클라이언트에서 실행되는 RPC의 경우, 해당 Actor를 실제 소유하고 있는 클라이언트에서만 함수가 실행

4. 클라이언트에서 호출되고 서버에서 실행되는 RPC의 경우, 클라이언트는 RPC가 호출되는 Actor를 소유해야한다

5. Multicast는 아래와 같은 경우다

- 서버에서 호출되는 경우, 서버에서는 로컬에서 실행될 뿐만 아니라 현재 연결된 모든 클라이언트에서도 실행된다.

- 클라이언트에서 호출되는 경우, 로컬에서만 실행되며, 서버에서는 실행되지 않는다

- 현재 멀티케스트 이벤트에 대해 단순한 스로틀 조절 메카니즘이 있다. 이는 멀티케스트 함수는 주어진 액터의 네트워크 업데이트 기간동안 두 번 이상 리플리케이트되지 않는다.

 

신뢰성

기본적으로 RPC는 비신뢰성이지만 RPC 호출이 원격 머신에서 확실히 실행되도록 하기 위해서는 Reliable 키워드를 붙이면 된다.

UFUNCTION( Client, Reliable )	
void ClientRPCFunction();

 

블루프린트

- RPC로 마킹된 함수는 블루프린트에서 호출해도 리플리케이트된다. 하지만 현재는 동적으로 함수를 RPC 마킹하는 것은 가능하지 않는다.

- Custom event는 블루프린트 에디터 안에서 replicated 마킹 가능하다. 이 기능을 사용하기 위해서 이벤트 그래프에서 custom event를 새로 만들고 아래와 같은 detail 뷰에 세팅을 한다. 

인증

- 악성 데이터/입력 감지를 위해 RPC에 인증(validation) 함수를 추가하는 기능이 있다

- RPC에 대한 인증 함수가 악성 파라미터를 감지한 경우, 해당 RPC를 호출한 클라이언트/서버 연결을 끊도록 시스템에 알린다. 

- RPC에 대해 인증 함수를 선언하려면, UFUNCTION 선언문에 WithValidation 키워드를 추가하면 된다.

UFUNCTION( Server, WithValidation )
void SomeRPCFunction( int32 AddHealth );
bool SomeRPCFunction_Validate( int32 AddHealth )
{
	if ( AddHealth > MAX_ADD_HEALTH )
	{
		return false;                       // This will disconnect the caller
	}
	return true;                              // This will allow the RPC to be called
}

void SomeRPCFunction_Implementation( int32 AddHealth )
{
	Health += AddHealth;
}

- 그런 다음 Implementation 함수 옆 어딘가에 Validate 함수를 넣어주면 된다

- 클라이언트->서버 RPC의 경우 _Validation 함수를 포함하도록 UHT(UObject 시스템을 지원하는 맞춤형 파싱 및 코드 생성 툴)를 변경했다. 서버 RPC 함수의 안정성 확보를 위해, 알려진 모든 입력 제한에 대해 각각의 모든 파라미터의 유효성 검사를 위한 코드를 쉽게 추가할 수 있기 위함이다.