1. 개요
RPC(Remote Procedure Call)는 클라이언트와 서버 간에 특정 시점에만 함수를 호출해 통신을 최적화하는 방법임 서버에 있는 함수를 클라이언트에서 요청하면 서버가 처리 후 결과를 다시 클라이언트에게 전달함 불필요한 모든 프레임 통신을 피하고, 필요한 순간에만 호출할 수 있어 대역폭을 절약함
2. RPC 유형
언리얼 엔진에서 제공하는 주요 RPC 유형은 다음과 같음
-
Server RPC 클라이언트가 서버 권한 함수를 호출할 때 사용 선언 예시:
UFUNCTION(Server, Reliable, WithValidation) -
Client RPC 서버가 특정 클라이언트에게만 함수를 호출할 때 사용 선언 예시:
UFUNCTION(Client, Reliable) -
NetMulticast RPC 서버가 모든 클라이언트에게 함수를 호출할 때 사용 선언 예시:
UFUNCTION(NetMulticast, Unreliable)
3. 구현 방법 및 예제
다음은 클라이언트에서 서버로 요청하고, 처리 결과를 모두에게 뿌려주는 흐름임
// 헤더 (.h)
UFUNCTION(Server, Reliable, WithValidation)
void Server_DoAction(int32 Param);
bool Server_DoAction_Validate(int32 Param);
void Server_DoAction_Implementation(int32 Param);
UFUNCTION(NetMulticast, Unreliable)
void Multicast_OnActionDone(int32 Result);
// 소스 (.cpp)
bool AMyActor::Server_DoAction_Validate(int32 Param)
{
// 클라이언트 입력 검증
return (Param >= 0);
}
void AMyActor::Server_DoAction_Implementation(int32 Param)
{
// 서버 로직 처리
int32 Result = Param * 2;
// 처리 후 모든 클라이언트에 통보
Multicast_OnActionDone(Result);
}
void AMyActor::Multicast_OnActionDone_Implementation(int32 Result)
{
// 클라이언트별 후처리 (UI, 이펙트 등)
OnActionDone(Result);
}
// 클라이언트 호출 위치
if (!HasAuthority())
{
Server_DoAction(5);
}
4. 주의사항 및 팁
WithValidation 사용 시, 클라이언트가 악의적으로 호출하는 것을 방지할 수 있음
-
Reliable vs Unreliable 중요한 정보는 Reliable, 빠른 퍼포먼스가 우선이면 Unreliable 선택
-
Role 체크 클라이언트에서만 Server RPC를 호출하도록 `if (Role < ROLE_Authority)` 검사 필요
-
Replication 설정 함수 호출만 지원하고 변수 복제는 따로 설정해야 함
-
스팸 호출 주의 너무 잦은 RPC 호출은 네트워크 부하를 늘리므로 최소화할 것
5. 요약
- RPC는 필요한 순간에만 함수 호출해 통신 효율 극대화함
- Server, Client, NetMulticast 유형으로 구분해 각 상황에 맞게 사용함
- WithValidation, Reliable/Unreliable 옵션을 적절히 설정해 보안과 퍼포먼스 균형을 맞출 것
- Role 체크와 스팸 호출 방지로 안정적인 네트워크 환경 구축 가능함