
다른 복제(Replication) 방법으로는 "RPC"가 있습니다. RPC는 "Remote Procedure Call(원격 프로시저 호출)"의 약자입니다.
RPC는 다른 인스턴스에서 무언가를 호출할 때 사용됩니다. TV 리모컨이 TV에 신호를 보내는 것과 비슷합니다.
Unreal Engine에서는 클라이언트에서 서버로, 서버에서 클라이언트로, 또는 서버에서 특정 그룹으로 이벤트를 보내는 데 RPC를 사용합니다.
이러한 RPC는 반환값을 가질 수 없습니다! 값을 반환하려면 반대 방향으로 두 번째 RPC를 사용해야 합니다.
RPC는 특정 규칙 하에서만 동작합니다. 공식 문서에서도 확인할 수 있는 이 표에 그 규칙이 나와 있습니다:
RPC가 완전히 동작하려면 몇 가지 요구 사항을 충족해야 합니다:
| 액터 소유권 | Not Replicated | NetMulticast | Server | Client |
|---|---|---|---|---|
| Client-owned Actor | 서버에서 실행 | 서버 및 모든 클라이언트에서 실행 | 서버에서 실행 | 액터의 소유 클라이언트에서 실행 |
| Server-owned Actor | 서버에서 실행 | 서버 및 모든 클라이언트에서 실행 | 서버에서 실행 | 서버에서 실행 |
| Unonwed Actor | 서버에서 실행 | 서버 및 모든 클라이언트에서 실행 | 서버에서 실행 | 서버에서 실행 |
| 액터 소유권 | 복제되지 않음 | NetMulticast | 서버 | 클라이언트 |
|---|---|---|---|---|
| Owned by invoking Client | 호출한 클라이언트에서 실행 | 호출한 클라이언트에서 실행 | 서버에서 실행 | 호출한 클라이언트에서 실행 |
| Owned by a different Client | 호출한 클라이언트에서 실행 | 호출한 클라이언트에서 실행 | 무시됨 | 호출한 클라이언트에서 실행 |
| Server-owned Actor | 호출한 클라이언트에서 실행 | 호출한 클라이언트에서 실행 | 무시됨 | 호출한 클라이언트에서 실행 |
| Unowned Actor | 호출한 클라이언트에서 실행 | 호출한 클라이언트에서 실행 | 무시됨 | 호출한 클라이언트에서 실행 |

블루프린트에서 RPC는 CustomEvent를 생성하고 Replicate로 설정하여 만듭니다.

RPC는 반환값을 가질 수 없으므로, 함수로는 만들 수 없습니다.
'Reliable' 체크박스를 사용하면 RPC를 '신뢰'하도록 설정하며, 해당 RPC가 손실되지 않도록 보장합니다.
🔥 주의
모든 RPC를 Reliable로 표시하지 마세요!
가끔 호출되고 반드시 도착해야 하는 RPC에만 사용해야 합니다.
Tick에서 Reliable RPC를 호출하면 Reliable 버퍼가 가득 차서, 다른 속성이나 RPC가 더 이상 처리되지 않을 수 있습니다.
C++에서 네트워크 기능을 사용하려면 프로젝트 헤더에 “UnrealNetwork.h”를 포함해야 합니다. C++에서 RPC를 만드는 것은 비교적 간단하며, UFUNCTION() 매크로에 지정자를 추가하면 됩니다.
// 이것은 ServerRPC로, unreliable 및 WithValidation(필수!)로 표시됩니다.
UFUNCTION(Server, unreliable, WithValidation)
void Server_Interact();
CPP 파일에서는 '_Implementation' 접미사가 붙은 별도의 함수를 구현해야 합니다.
// 실제 구현 함수입니다. 호출할 때는 "Server_Interact"를 사용합니다.
void ATestPlayerCharacter::Server_Interact_Implementation()
{
// 예: 문과 상호작용!
}
CPP 파일에는 '_Validate' 접미사가 붙은 버전도 필요합니다. 이에 대해서는 나중에 더 설명합니다.
bool ATestPlayerCharacter::Server_Interact_Validate()
{
return true;
}
다른 두 가지 유형의 RPC는 다음과 같이 생성합니다:
ClientRPC는 'reliable' 또는 'unreliable'로 표시해야 합니다.
UFUNCTION(Client, unreliable)
void ClientRPCFunction();
Multicast RPC도 'reliable' 또는 'unreliable'로 표시해야 합니다.
UFUNCTION(NetMulticast, unreliable)
void MulticastRPCFunction();
물론, RPC에 'reliable' 키워드를 추가하여 신뢰성을 높일 수도 있습니다.
UFUNCTION(Client, reliable)
void ReliableClientRPCFunction();
UFUNCTION(NetMulticast, reliable)
void ReliableMulticastRPCFunction();
Validation의 개념은 RPC의 validation 함수가 파라미터에 문제가 있음을 감지하면, 해당 RPC 호출을 시작한 클라이언트/서버의 연결을 끊도록 시스템에 알릴 수 있다는 것입니다.
현재 모든 ServerRPCFunction에는 Validation이 필요합니다.
UFUNCTION 매크로의 'WithValidation' 키워드를 사용합니다.
UFUNCTION(Server, unreliable, WithValidation)
void SomeRPCFunction(int32 AddHealth);
'_Validate' 함수가 어떻게 사용되는지 예시는 다음과 같습니다:
bool ATestPlayerCharacter::SomeRPCFunction_Validate(int32 AddHealth)
{
if (AddHealth > MAX_ADD_HEALTH)
{
return false; // 이 경우 호출자의 연결이 끊깁니다!
}
return true; // 이 경우 RPC가 호출됩니다!
}
💡 info
클라이언트-서버 RPC는 '_Validate' 함수가 필요합니다. 이는 안전한 서버 RPC 함수를 장려하고, 모든 파라미터가 알려진 입력 제약 조건에 맞는지 쉽게 확인할 수 있도록 하기 위함입니다.