복제

Strix에서 연결이 어떻게 작동하는지 이해했으므로, 지금부터는 Strix의 복제 기능을 살펴보겠습니다. 이를 위해 먼저 로그인하여 복제 맵을 만듭니다. 두 번째 플레이어는 아직 연결하지 않습니다.

../../../_images/replicationmap1.png
  • 현재 연결된 상태이며, 실행할 수 있는 플레이어 캐릭터가 하나 있습니다. 보이는 것처럼 컬러 강도는 계속 변합니다. 이 외에 게임에서 복제할 수 있는 값은 많습니다. 여기서는 컬러 값에만 집중하겠습니다. 이제 두 번째 플레이어로 방에 연결해 보겠습니다.

../../../_images/roomownernotification.png ../../../_images/visualreplication.png
  • 연결할 때는 현재 방장의 이름을 표시합니다. 이제 두 플레이어가 복제된 것이 보입니다. 각 플레이어는 자기 클라이언트가 따로 있고 여기저기 돌아다니기도 합니다. 또, 컬러 강도도 복제되고 있습니다. 여기서, 원격 플레이어(즉, 방에 있는 다른 플레이어)는 파란색이고 로컬 플레이어(나)는 빨간색입니다. 지금부터는 값과 액터를 어떻게 복제하는지 살펴보겠습니다. 움직임 동기화는 나중에 살펴보겠습니다. ReplicationBP > Blueprints 폴더에서 ThirdPersonCharacter 블루프린트를 엽니다.

  • 이 블루프린트의 여러 기능을 설명하는 코멘트가 다수 보일 것입니다. 이중에서 관심의 대상이 되는 것은 Strix Replicator, Movement Synchronizer, Notification Listener 요소입니다. Strix Replicator는 클라이언트 간에 액터를 복제하고, Movement Synchronizer는 움직임을 동기화하고, Notification Listener는 네트워크 이벤트를 포착하는 역할을 합니다.

참고

복제할 때 유의해야 하는 점 중 하나는 복제된 액터가 오리지널과 같은 로직을 실행하고 있다는 것입니다. 이 때문에 복제하고 싶은 값을 설정할 때는 로컬 액터에서만 하면 됩니다. 그러지 않으면 레플리카가 변경사항을 덮어쓰기합니다. Strix에는 이 과정이 원활하게 일어나도록 액터가 로컬 액터인 경우 을 리턴하는 Get Is Owner 함수가 있습니다. 이 샘플 곳곳에서 이 체크가 사용되는 모습을 볼 수 있습니다.

참고

위 내용 외에, 복제된 액터에서는 일반 로직을 거듭 확인하는 것이 좋습니다. 로직에 틱(tick) 단위로 실행되거나 플레이 시작 시 한 번만 호출하면 되는 동작이 있을 수도 있기 때문입니다. 대표적인 것으로는, 스폰 지점으로 텔레포팅, 플레이어 컨트롤러 관련 함수등이 있습니다. 이런 동작들이 복제된 액터에 남아 있으면 두 번 호출되어 원치 않는 행동을 유발하고 효율을 떨어뜨릴 수 있습니다.

  • 캐릭터와 그 값을 복제할 때는 Replicator 요소를 연결하고 복제를 원하는 변수를 세부사항 패널의 복제 옵션에서 Replicated로 설정하기만 하면 됩니다. 누군가 게임에 입장했음을 표시하고 싶을 때는 Room Join Notification Event에서 그 정보를 출력합니다. Replicator 요소는 복제된 변수를 자동으로 동기화합니다. 단 auto register properties가 비활성화되면 자동 동기화는 일어나지 않으며, C++ 코드에서 속성을 수동으로 등록해야 합니다.

../../../_images/updateroomownername.png
  • 레벨 GameMode를 보면 방장 정보를 표시하는 로직이 일부 보입니다. Replicator 요소에는 On Sync Begin, On Ownership Received와 같은 자체 이벤트가 몇 가지 있습니다. On Sync Begin은 Replicator가 서버와 동기화를 시작할 때 호출되고 On Ownership Received는 이 클라이언트가 방장이 되면 호출됩니다. 이 두 이벤트가 발생하면 방장의 이름을 출력합니다.

../../../_images/replicatorsettings.png
  • Strix Replicator에는 설정이 몇 갖지 있으며, 이것은 복제 섹션에서 설명합니다. 여기서 살펴볼 설정은 Instantiable By 설정입니다. 플레이어는 이것이 Anyone으로, GameMode에서는 Room Owner로 설정됩니다. Strix는 방장이라는 개념이 있습니다. 방을 만든 첫 클라이언트를 지칭합니다. 방장은 방에서 동작 권한을 부여합니다. 복제할 때 설정이 Anyone인 경우, 각 클라이언트가 액터를 만들 수 있습니다. 그리고 이 액터는 복제됩니다. Room Owner로 설정되어 있는 경우, 방장만 이 액터를 만듭니다. 그 외 클라이언트는 모두 그 액터의 레플리카(원격)를 만들 뿐, 자신의 것(로컬)은 만들지 않습니다. 이것은 클라이언트마다 싱글 게임 모드 인스턴스를 만들 수 있다는 뜻입니다. 이렇게 되면 변수의 설정을 방장으로 한정하고 클라이언트마다 로직이 호출되게 할 수 있습니다. Connection Closed Behaviour는 GameMode에서 Change Ownership입니다. 방장이 연결을 차단한 후에도 이 GameMode가 계속 살아 있어야 하기 때문입니다.

  • 방장은 게임 플레이 중에 바뀔 수 있습니다. 대개는 방장이 떠날 때 바뀌며, 이 경우 새 클라이언트가 방장으로 자동 선임됩니다. 방장은 권한이 필요한 동작을 하고 정보를 처리하고 클라이언트에게 복제를 할 수 있으며, 플랫폼이나 NPC 등 다른 플레이어가 제어할 수 없는 액터를 복제할 수 있습니다.

여기 있는 예는 모두 움직임 동기화를 이용합니다.

  • 액터의 위치를 동기화할 때는 Strix Movement Synchronizer를 추가하고 설정을 원하는 대로 미세 조정해도 됩니다. 여기서는 Movement Synchronizer를 캐릭터 기본 지면 위 움직임에 이용합니다.

  • 여기서는 비행 맵을 만듭니다.

../../../_images/flying.png
  • 이 비행의 예는 서로 다른 값이 필요한 Strix Movement Synchronizer 요소를 다르게 이용하는 것을 보여줍니다. FlyingSyncBP/Blueprints 폴더에서 FlyingPawn 블루프린트를 열어 이 값을 확인하고 그것으로 플레이할 수 있습니다.