글에 사용된 모든 그림과 내용은 직접 만들고 작성한 것입니다.
언리얼 엔진으로 멀티플레이 게임을 만들기 위해 RPC에 대해 학습한 내용을 정리하기 위해 작성.
RPC를 사용했을 때 디버깅이 쉽지 않다는 것을 알게 되었고, 싱글플레이보다 더 고려해야할 점이 많다는 것을 알게 되었습니다. RPC 호출이 원격 머신에서 실행되도록 보장하기 위해서 Reliable 키워드를 사용해야하고, WithValidation 키워드로 악성 파라미터를 감지했을때 해당 연결을 끊을 수 있습니다.
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/replicate-actor-properties-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/remote-procedure-calls-in-unreal-engine
공식 홈페이지에 들어가면 정의에 대해서 자세하게 읽어볼 수 있습니다. 간단하게 요약하자면 네트워크를 통해 멀티플레이가 가능한 게임을 만들기 위해 RPC를 알아야합니다. 결국 GAS 프레임워크도 동기, 비동기를 적절하게 사용해서 이 RPC를 사용하기 편하게 만든 것입니다.
코드를 짜면서 조심해야할 점은 이 기능이 서버와 통신을 해야하는 부분인지 아닌지 해야한다면 어떻게 해야하고 그 기준을 어떻게 세워야할지를 생각해야합니다.
깊게 들어가면 엄청 어렵지만 간단하게 작동 방식을 설명하겠습니다.
다음과 같은 서버 - 클라이언트 모델이 있다고 생각해봅시다.
실행 흐름을 두 개로 나눠보려고 합니다. 그림에서 빨간색 테투리로 되어 있는 부분이 현재 기능이 실행중인 부분입니다. 버튼을 클릭하는 다음의 간단한 예시 코드로 설명해보겠습니다. RPC_Click() 부분에서 HasAuthority() == true 일때도 Server_ClickButton 함수를 실행하면 코드가 더 간단해집니다. 지금은 설명을 돕기위해 기능을 명시해뒀습니다.
- Server에서 실행
- Client에서 실행
// .h 헤더파일 부분
void RPC_Click(AMyButtonActor* ButtonActor);
UFUNCTION(Server, Reliable, WithValidation)
void Server_ClickButton(AMyButtonActor* ButtonActor);
UFUNCTION(NetMulticast, Reliable)
void NetMulticast_ClickButton(AMyButtonActor* ButtonActor);
// .cpp cpp파일 부분
void AMyPlayerController::RPC_Click(AMyButtonActor* ButtonActor)
{
if (HasAuthority()) /////// 서버-1
{
ButtonActor->ClickButton();
NetMulticast_ClickButton(ButtonActor); ////// 서버-2
}
else
{
Server_ClickButton(ButtonActor); ////// 클라-1
}
}
void AMyPlayerController::NetMulticast_ClickButton_Implementation(AMyButtonActor* ButtonActor)
{
if (!HasAuthority() && ButtonActor)
ButtonActor->ClickButton(); ///// 서버-3, 클라-4
}
bool AMyPlayerController::Server_ClickButton_Validate(AMyButtonActor* ButtonActor)
{
return true;
}
void AMyPlayerController::Server_ClickButton_Implementation(AMyButtonActor* ButtonActor)
{
if (ButtonActor)
ButtonActor->ClickButton(); ////// 클라-2
NetMulticast_ClickButton(ButtonActor); //////// 클라-3
}
1️⃣ 서버-1 : Server에서 해당 기능이 실행됩니다.
2️⃣ 서버-2 : 그리고 실행이 끝나면 Client들에게 같은 기능을 너네들도 실행해 라고 알려줍니다.
3️⃣ 서버-3 : 만약 Validate 체크에서 이상이 없다면, Client들은 자기 자신에 있는 기능을 실행합니다.
1️⃣ 클라-1 : Client는 서버에게 이 기능을 수행하려고 하는데 해도 되는지 물어봅니다.
2️⃣ 클라-2 : 서버에서 문제가 없다면, 즉 Validate 체크도 통과하고 로직에 문제가 없다면 해당 기능을 실행합니다.
3️⃣ 클라-3 : 서버에서 실행이 끝나면 클라이언트들에게 너네들도 실행해라고 알려줍니다.
4️⃣ 클라-4 : Validate 체크가 통과한다면 클라이언트들도 기능을 실행합니다.