언리얼 C++에서 서버와 클라이언트 각각에서 실행되는지 여부를 잘 체크해야 한다. PROPERTY Replication과 RPC의 사용방법에는 차이가 있다. 두 방법의 차이점을 파악하고 상황에 맞게 활용하자.

 

목차

     

     


     

     

    리플리케이션 (Replication)

     


     

    액터 리플리케이션 (Actor Replication)

     

    리플리케이션은 액터(Actor)를 기준으로 실행된다.

     

    Server는 액터 목록을 유지하고, Client에서 (리플리케이트되도록 마킹된) 각 액터에 대한 근접 추정치를 유지할 수 있도록 클라이언트를 주기적으로 업데이트한다.


     

     

    액터 업데이트 방식:  프로퍼티 업데이트, RPC

     

    액터의 업데이트 방식: 

    1. 변수 리플리케이션 (PROPERTY Update)
    2. RPC (Remote Procedure Call)

     

    프로퍼티변경될 때마다 자동으로 Replicate 된다.

    반면에, RPC실행될 때만 Replicate 된다.

     


     

     

    1. 변수 리플리케이션  (PROPERTY Update)

     

    언리얼에서 제공하는 프로퍼티 업데이트 방법은 다음과 같다. 이 때 자료형은 AActor*나 그 하위 클래스여야 한다.

     

    ① UPROPERTY() 매크로에 Replicated 명시하기

    • UPROPERTY 매크로에서 Replicated 또는 ReplicateUsing 지정자를 사용한다.
    • Authority에 있는 액터에서 리플리케이티드 변수의 값이 변경될 때마다, 해당 정보가 자동으로 Authority 있는 액터에서 세션에 접속된 원격 프록시로 전송된다.

     

     

     

    ② GetLifetimeReplicatedProps 함수 사용

     

     

     

    ② 생성자에서 bReplicated = true; 설정

    • C++ 액터 클래스에서 bReplicates 변수를 설정하여 특정 클래스의 액터에 대한 리플리케이션을 활성화할 수 있다.

    AWeapon::AWeapon()
    {
    	bReplicates = true; //만약 false라면 replicated되지 않아 모든 플레이어가 Authority를 가지게 된다. 예를 들어 플레이어1이 총을 발사하면 다른 플레이어들도 (각각의 독립된 서버가 존재하기 때문에) 총이 발사된다. 하지만 bReplicates=true라면 서버 하나만 Authority를 가지고 관리한다. 플레이어1이 총을 발사하면 서버에 정보를 알리고 모든 Client에 전파한다.
    	SetReplicateMovement(true); // 무기의 Movement를 Replicated 해준다.
    
    	WeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WeaponMesh"));
    	SetRootComponent(WeaponMesh);
    }

     

     


     

     

     

    2. RPC (Remote Procedure Call)

     

    Replicated와 Replicated Notify는 복제이고 RPC는 통신이다!  

      Replicated Replicated Notify RPC
      단순 복제  복제 후 특정 시점에 지정한 함수 호출 즉시 알림. 통신.
      스케쥴링. 모은 다음에 복제.
    그 틱에 바로 가지 않는다
    Replicated와 마친가지로 즉시 복제는 안 된다.  수집하지 않음.
    데이터를 복제시키지 않음.
    그냥 통신한다.
    내가 원하는 시점에 통신으로 이벤트를 날린다.
      어느 시점에 바뀌는지 알지 못하지만 안전하게 바꾸고 싶을때 사용한다.  복제된 시점에 지정된 이벤트 함수(OnRep_OOO)를 호출하는 방식으로 사용한다. 그 시점에 이벤트를 파라미터와 
    복제본에서 원본으로 RPC 이벤트를 날릴 수 있다. 반면에 Replicate로는 복제본에서 원본으로 날릴 수 없다.

     

     

    ※ 주의사항) RPC 

    Replicated와 같은 Tick에 RPC를 날리면 안 된다!!!

     

    ex. 총을스폰 시킨 후 총을 반짝이는 기능을 구현하고 싶다. 총을 스폰시킨 시점(Replicated 된 시점)에 반짝이게 하는 RPC를 날리면 안 된다. 총이 스폰되기 전에 반짝이는 함수를 콜하면 총이 없어 크래쉬가 난다. 네트워크 환경이 좋아 만약 통과하면 최악이다. 문제를 찾기가 힘들다. 

     

    ->> 해당 경우는 RPC가 아닌 Replicated Notify를 사용해서 총이 스폰된 시점(또는 스폰된 이후)에 반짝이는 기능의 함수를 호출하게 한다.

     


     

     

     

    참고자료

     

    https://docs.unrealengine.com/5.0/ko/networking-overview-for-unreal-engine/

     

    네트워크 개요

    멀티플레이어용 네트워크 게임 구성하기 입니다.

    docs.unrealengine.com