RPC (Remote Procedure Call)은 함수를 호출하는 기기와 다른 기기에서 실행할 수 있는 원격 실행 함수이다.
RPC는 멀티플레이어 환경에서 서버/클라이언트 간의 전송에 유용하게 사용된다.
어떤 액터 프로퍼티를 복제(Replicate) 할 때는 항상 서버에서 클라이언트 방향으로 이루어졌는데, 만약 클라이언트의 동작이 서버에도 전달되어야 하는 경우에는 RPC를 사용한다.
UFUNCTION(Client)
void ClientRPCFunction();
UFUNCTION(Server)
void ServerRPCFunction();
UFUNCTION(NetMulticast)
void MulticastRPCFunction();
UFUNCTION 프로퍼티에 이 함수가 어디서 실행될 것인지를 명시해 주면 된다.
그리고 명시된 것과 동일하게 함수명에 Prefix를 붙여주는 것이 보편적이다. 함수명만 보고도 이 함수가 어디서 실행되는지 알 수 있어야 좋기 때문이다.
액터 소유 | No Replicate | NetMulticast | Server | Client |
---|---|---|---|---|
클라이언트 | 서버 | 서버와 모든 클라이언트 | 서버 | 액터의 Owning 클라이언트 |
서버 | 서버 | 서버와 모든 클라이언트 | 서버 | 서버 |
None | 서버 | 서버와 모든 클라이언트 | 서버 | 서버 |
액터 소유 | No Replicate | NetMulticast | Server | Client |
---|---|---|---|---|
호출 클라이언트 | 호출 클라이언트 | 호출 클라이언트 | 서버 | 호출 클라이언트 |
다른 클라이언트 | 호출 클라이언트 | 호출 클라이언트 | 드랍 | 호출 클라이언트 |
서버 | 호출 클라이언트 | 호출 클라이언트 | 드랍 | 호출 클라이언트 |
None | 호출 클라이언트 | 호출 클라이언트 | 드랍 | 호출 클라이언트 |
클라이언트에서 서버로 전송하려면 Server
UFUNCTION을 명시하여 replicate 해 주면 된다.
기본적으로 RPC는 비신뢰성이지만, UFUNCTION 프로퍼티에 추가적으로 Reliable
을 붙여 주면 이 RPC가 실행될 것임을 보장할 수 있다.
멀티플레이어 게임에서 조준하는 기능을 만드려고 할 때 조준 애니메이션은 나뿐 아니라 세션에 참여하는 모든 클라이언트에서 볼 수 있어야 한다. 즉 클라이언트의 함수 호출이 서버에서 실행되어 다른 클라이언트의 프록시들에게 replicate 되어야한다.
애니메이션 전환을 위한 bAiming
변수를 만들고 이것을 인풋에 따라 변경하는 함수인 SetAiming
을 만들었다. 하지만 이것만으로는 이 동작을 수행할 수 없다. bAiming
이 복제되지 않기 때문이다.
다음과 같은 절차로 RPC를 사용할 수 있다.
bAiming
변수에 UPROPERTY(Replicated)
를 명시하여 복제 변수로 만든다.GetLifetimeReplicatedProps()
함수에서 DOREPLIFETIME
매크로를 이용해 등록한다.ServerSetAiming()
함수를 만들고 이 함수를 UFUNCTION(Server, Reliable)
로 명시한다.ServerSetAiming_Implementation()
함수에서 SetAiming
과 같은 작업을 실행한다.void UCombatComponent::SetAiming(bool bIsAiming)
{
bAiming = bIsAiming;
ServerSetAiming(bIsAiming);
}
void UCombatComponent::ServerSetAiming_Implementation(bool bIsAiming)
{
bAiming = bIsAiming;
}
SetAiming()
에서 bAiming = bIsAiming
부분은 필요없긴 하지만 서버를 거쳐 값을 변경하고 그 값이 복제되면 애니메이션이 전환되는 것보다는 즉시 애니메이션 전환이 이뤄지는게 더 매끄러우므로 바로 값을 바꿔주었다.
만약 SetAiming()
함수가 클라이언트에서 호출된다면 ServerSetAiming
함수가 서버에서 실행되고 따라서 모든 클라이언트에 있는 내 Simulated proxy의 애니메이션이 전환된다.