[Unreal] 원격 프로시저 호출(RPC)
RPC 이해
언리얼 엔진에는 세가지 유형의 RPC가 있다.
- Server: 클라이언트 PC의 오브젝트가 함수를 호출하지만 동일한 오브젝트의 서버 버전에서만 실행된다. 클라이언트는 함수를 호출하는 오브젝트를 소유해야 한다.
- Client: 서버에서 오브젝트가 함수를 호출하지만, 함수를 호출하는 오브젝트를 소유한 클라이언트 버전에서만 실행된다.
- NetMulticast: 서버에서 오브젝트가 함수를 호출하며, 서버와 함수를 호출하는 오브젝트의 모든 클라이언트 버전에서 실행된다. 클라이언트에서도 호출할 수 있지만, 이 경우에는 로컬에서만 실행된다.
함수가 RPC로 올바르게 실행되려면, 액터가 함수를 호출해야 하며 해당 액터가 복제돼야한다. 또한 함수는 URUNCTION() 매크로로 지정돼야한다.
소유하는 클라이언트에서만 실행될 함수는 .h 파일에 다음 코드와 같이 선언한다.
UFUNCTION(Client)
void DoSomething_Client();
위의 헤더에 대응하는 .cpp 파일에서는 이 함수에 _Implementation 접미사를 추가해 구현해야 한다.
예를 들어 .h 헤더 파일에 다음 코드와 유사한 함수 선언이 있다고 가정해보자.
UFUNCTION(Server)
void DoSometing_Server();
.cpp 파일에 다음 함수를 구현해야 한다.
void DoSomthing_Server_Implementation()
{
/* Your code here */
}
RPC의 신뢰성
RPC는 비신뢰성을 기본으로 한다. 그러나 신뢰성을 강제하고 메시지가 목적지에 안전하게 도달하도록 보장하고 싶을 때가 있다. 클라이언트에서 신뢰성을 갖고 실행돼야 하는 함수는 다음과 같은 코드로 선언한다.
UFUNCTION(Client, Reliable)
void DoSomethingReliabley_Client();
이 코드는 비신뢰성 때문에 네트워크상에서 데이터가 손실되는 위험 없이, 함수 호출이 클라이언트에서 수신되고 올바르게 실행되도록 보장한다.
RPC 인증
언리얼 엔진에서 함수가 잘못된 데이터나 입력 없이 실행될 수 있는지 확인하는 추가 기능을 제공한다. 이것이 바로 인증(valideation)이다.
RPC 호출에 대해 함수를 인증해야 한다고 선언하려면, UFUNCTION() 선언문에 WithValidation 지정자를 추가하고, bool 타입을 반환하는 추가 함수를 구현해야 한다. 이 함수의 이름은 인증을 받는 함수와 동일하지만, _Validate 접미사를 추가한다.
예를 들어 인증 기능이 있는 함수는 .h 파일에서 다음과 같이 선언한다.
UFUNCTION(Server, WithValidation)
void DoSomethingWithValidation();
그다음에는 .cpp 파일에서 두 가지 멤버 함수를 구현해야 한다. 첫 번째는 일반 함수이며, 다음 코드와 같다.
void DoSomethingWithValidation_Implementation()
{
/* Your code here */
}
두 번쨰는 실제 인증 함수이며 다음 코드와 같다.
bool DoSomethingWithValidation_Validate()
{
/* Your code here */
}
_Validate 함수는 코드가 인증되면 ture를 반환하고, 그렇지 않으면 false를 반환한다. 인증이 성공하면 해당 함수가 실행되고, 그렇지 않으면 실행되지 않는다.