공부 기록

[UE4] 멀티 플레이 이벤트 복제 방법 (Replicate) 본문

Unreal/Blueprint

[UE4] 멀티 플레이 이벤트 복제 방법 (Replicate)

혜멘 2022. 2. 11. 16:10

Replication 개념

  • 클라이언트에서 서버에 복제 명령  ▶  서버에서 클라이언트들에 전달  ▶  모든 클라이언트에서 실행

Role / Remote Role

  • 실행되는 주체가 서버인지, 클라이언트인지 구분하여 각각에서 실행될 이벤트를 제어
  • 서버 (ROLE_Authority) / 클라이언트 (ROLE_SimulatedProxy)
  • 자신은 Role, 상대는 RemoteRole (ex. 서버는 Role 값이 ROLE_Authority, RomoteRole 값이 ROLE_SimulatiedProxy)

아래는 각각 블루프린트와 C++ 스크립트에서의 Replicate 구현 방법이다.

 

[Blueprint Replicate]

1. 복제할 이벤트 노드의 디테일 패널에서 Replicates - multicast 로 설정

 

 

 

2. Replicates - Run on server 타입 이벤트에서 복제할 이벤트 (multicast) 호출

 

 

3. 이벤트를 실행하고 싶은 곳에서 Server Event 이벤트 호출

 

 

참고로 Replicate는 플레이어가 소유하고 있는 액터에서만 실행할 수 있다.

따라서 이벤트 구현은 반드시 player controller 혹은 컨트롤러와 연결된 액터에 구현하여야 한다. (ex. pawn

 

다만 서버에 복제 명령을 전달하는 과정(3번)은 어느 곳에서 하든 상관없다.

 

[C++ Replicate]

헤더파일.h

    int num;
    void SetInt(int n);

    UFUNCTION(reliable, server, WithValidation)
    void ServerSetInt(int n);

 

 

실행파일.cpp

void AMyController::SetInt(int n)
{
    // 클라이언트 변수에 값 할당 
    num = n;
    
    // 클라이언트인지 서버인지 구분
    if (Role == ROLE_SimulatedProxy)
    {
        ServerSetInt(n);
    }
}

bool AMyController::ServerSetInt_Validate(int n)
{
    return true;
}

void AMyController::ServerSetInt_Implementation(int n)
{
    // 클라이언트가 네트워크를 통해 호출한 서버에서 실행되는 함수 (Role == ROLE_Authority)
    // 서버에서 실행되므로 아래 함수에서는 ServerSetInt가 실행되지 않고 변수값만 변경
    SetInt(n);
}

 

  

Comments