RPC (Remote Procedure Call)은 로컬에서 호출되지만 (호출하는 머신과는) 다른 머신에서 원격 실행되는 함수를 말한다. RPC 함수는 매우 유용하게 사용될 수 있으며, 네트워크 연결을 통해 클라이언트와 서버 사이에 메시지를 전송할 수 있다. 자세한 사항은 위의 공식 문서에서 살표보자.
현재 상황은 땅에 떨어진 AWeapon을 주워서 장착해야 하는 상황이다. 이러한 실행은 멀티 플레이 게임의 특성 상 서버에서 실행되어야 올바르다. 즉, 클라이언트에서 장착 함수를 호출하면 서버에서 해당 함수가 실행되어야 하기에 RPC가 필요하다.
// RPC 함수, UFUNCTION(Server)로 했기에, 클라이언트에서 호출되고 Server에서 실행된다.
// Reliable로 호출이 원격 머신에서 확실히 실행되도록 한다.
UFUNCTION(Server, Reliable)
void ServerEquipButtonPressed();
위 함수는 RPC함수로, UFUNCTION(Server)이므로, 클라이언트에서 호출되고 서버에서 실행된다. 다른 키워드는 위의 링크에서 찾아보자. 해당 함수는 호출하는 인스턴스만 제공하며, 실질적인 구현은 함수명을 _Implementation을 붙인 새로운 함수로 구현해줘야 한다.
// RPC함수는 뒤에 _Implementation을 붙여 원격 머신에서 무슨 일이 일어나는지 구현한다.
void ABlasterCharacter::ServerEquipButtonPressed_Implementation()
{
// Server에서 실행될 것을 우리는 알고 있기에 HasAuthority가 필요없다.
if (Combat)
{
Combat->EquipWeapon(OverlappingWeapon);
}
}
위의 함수는 현재 Overlap된 무기를 캐릭터에 장착하도록 ActorComponent의 EquipWeapon함수를 호출하고 있다. 또한, 이 함수는 서버에서 실행된다는 것을 알고 있으므로 Authority를 확인하지 않아도 상관 없다.
해당 함수를 호출하려면 어떻게 해야 하는지 알아보자.
void ABlasterCharacter::EquipButtonPressed(const FInputActionValue& Value)
{
if (Combat)
{
if (HasAuthority())
{
// 서버 머신에서 호출했다면 바로 무기를 장착해준다.
Combat->EquipWeapon(OverlappingWeapon);
}
else
{
// 클라이언트 머신에서 호출했다면 RPC를 전달한다.
ServerEquipButtonPressed();
}
}
}
위의 함수는 SetupPlayerInputComponent에서 키보드 입력과 바인드한 함수이다. 서버 머신과 클라이언트 머신에서 호출된 경우를 나눠서 처리한다. 서버 머신에서 호출되었을 경우, 바로 서버 머신에서 무기 장착 함수를 실행하면 되므로 RPC함수를 호출할 필요가 없다. 클라이언트에서 호출한 경우, 서버 머신에서 무기 장착 함수가 실행되어야 하므로 RPC함수의 호출이 필요하다. 위에서 보다시피, 호출에는 _Implementation을 붙인 함수를 호출하는 것이 아닌, 헤더에서 선언하였던 함수를 호출해야 한다.
'Unreal Engine > 기타' 카테고리의 다른 글
[UE] 기본적인 멀티플레이 Game Framework (0) | 2024.01.21 |
---|---|
[UE] HUD와 PlayerController (0) | 2024.01.14 |
[UE] Variable Replication (0) | 2023.12.17 |
[UE] Network Role (1) | 2023.12.17 |
[UE] ServerTravel과 ClientTravel (0) | 2023.12.08 |