
드디어 멀티플레이의 꽃이라 불리는 RPC(Remote Procedure Call)의 세계에 입문했다. 오늘은 클라이언트와 서버가 어떻게 '대화'하는지를 중심으로 RPC를 파고들었다. 클라이언트가 서버에게 무언가를 요청하는 방법(
Server RPC)부터, 반대로 서버가 클라이언트에게 명령을 내리는 방법(Client,NetMulticast)까지, 통신의 각 방향에 대해 학습했다. 그리고 이 '대화'가 아무렇게나 이루어지는 것이 아니라, 소유권과 신뢰성이라는 엄격한 규칙과 약속 위에서 이루어진다는 사실을 깨달았다.
Server RPC의 원리와 규칙 이해하기Client 및 NetMulticast RPC의 차이점 파악하기Ownership, Reliable, WithValidation)의 중요성 설명하기RPC(Remote Procedure Call)는 간단히 말해 "호출은 여기서, 실행은 저기서!"를 가능하게 하는 원격 제어 기술이다. 오늘은 클라이언트와 서버가 이 기술을 이용해 어떤 '대화'를 주고받는지, 그 방향에 따라 살펴보자.
게임에서 플레이어가 하는 모든 중요한 행동(총 발사, 스킬 사용 등)은 클라이언트에서 시작된다. 하지만 이 행동이 진짜 게임 세계에 영향을 미치려면, 게임의 유일한 '심판'인 서버의 허락과 실행이 필요하다. 이때 클라이언트는 Server RPC를 사용해 서버에게 "말을 건다".
UFUNCTION(Server): "서버님, 제 부탁 좀 들어주세요!"PlayerController나 내 캐릭터(AutonomousProxy)가 바로 그런 존재다. 이 규칙 덕분에 다른 플레이어의 캐릭터를 멋대로 조종하는 해킹이 원천적으로 불가능해진다.서버는 클라이언트의 요청을 처리하거나, 게임의 상태가 바뀌었을 때 클라이언트들에게 명령을 내려야 한다. 이 명령은 '특정 한 명'에게 내릴 수도, '모두'에게 내릴 수도 있다.
UFUNCTION(Client): "A 클라이언트, 너만 들어!" 🤫UFUNCTION(NetMulticast): "모두에게 알린다!" 📣클라이언트와 서버의 대화는 무질서하게 이루어지지 않는다. 안전하고 효율적인 통신을 위해 반드시 지켜야 할 '약속'들이 있다.
Reliable vs Unreliable)Unreliable), 플레이어에게 데미지를 주는 로직은 반드시 전달되어야 한다(Reliable). Reliable은 반드시 전달을 보장하지만 그만큼 비용(성능)이 비싸므로, 꼭 필요한 곳에만 써야 한다.WithValidation)Server RPC는 클라이언트의 요청을 받는 관문이므로, 항상 "이 요청이 올바른가?"를 의심해야 한다. WithValidation 키워드는 서버가 요청을 실행하기 전에 _Validate()라는 검증 함수를 거치게 하는 2차 방어벽이다. 여기서 마나가 부족하거나 쿨타임이 차지 않은 스킬 사용 요청 등을 거부할 수 있다.// UFUNCTION 매크로를 이용한 약속이 포함된 RPC 함수 선언
// 서버로, 반드시 전달하고, 유효성 검사까지 하는 RPC
UFUNCTION(Server, Reliable, WithValidation)
void Server_PlayerFire(FVector LookDirection);
// 1. 유효성 검사 (서버의 방어벽)
bool AMyCharacter::Server_PlayerFire_Validate(FVector LookDirection)
{
// 총알이 충분한가?
return bHasEnoughAmmo; // true를 반환해야만 아래 함수가 실행됨
}
// 2. 실제 실행 로직
void AMyCharacter::Server_PlayerFire_Implementation(FVector LookDirection)
{
// 실제 총알 발사 로직 (서버에서만 실행됨)
}
| 키워드 | 대화의 방향 | 설명 | 핵심 조건 |
|---|---|---|---|
Server | Client → Server | 클라이언트가 서버에게 함수 실행을 요청. | 클라이언트가 소유한 액터에서 호출 |
Client | Server → Client | 서버가 특정 클라이언트에게 함수 실행을 명령. | 서버에서 호출, 소유권이 있는 클라이언트에게만 |
NetMulticast | Server → All | 서버가 모두에게 함수 실행을 명령 (주로 코스메틱) | 서버에서 호출 |
WithValidation | (규칙) | 서버 RPC 실행 전, 서버에서 유효성을 검사하는 관문. | 보안을 위해 Server RPC에 적극 권장 |
Reliable | (약속) | RPC가 반드시 전송될 것을 보장. (데미지, 스폰 등) | Unreliable은 보장 안 됨 (이펙트, 사운드 등) |