# 멀티플레이어 이해하기

멀티플레이어 경험은 오브젝트와 환경의 *‘위치’* 또는 *‘상태’*&#xB97C; 제어하고 변경하는 비헤이비어(Behaviour)와 컴포넌트(Component)에 대한 동기화 기능을 향상시킵니다.

{% hint style="info" %}
즉, 오브젝트가 움직이거나 환경 변화가 발생할 때 모든 플레이어가 동시에 그러한 변화를 확인할 수 있습니다.
{% endhint %}

**Door(문) 비헤이비어**가 가장 좋은 예시입니다.

모든 플레이어가 이 행동이 포함된 액터를 트리거할 수 있으며 충돌 또한 모든 플레이어에 의해 변경됩니다. 문이 열리거나 닫히는 상황은 모든 플레이어에게 동일하기 때문입니다.

다른 예시로는 **Basic Platform(기본 플랫폼) 비헤이비어**가 있습니다.

이 행동이 포함된 액터가 한 장소에서 다른 곳으로 이동할 때, 이 이동은 모든 플레이어와 동기화됩니다.

{% hint style="success" %}
모든 플레이어에게 동기화되는 움직이는 플랫폼 또는 문 사용은 도전 과제를 설정하고 경험 내 다양한 지역을 향한 접근성을 제공하는 좋은 방법입니다.
{% endhint %}

### 싱글플레이어 vs. 멀티플레이어 <a href="#single-player-vs-multiplayer" id="single-player-vs-multiplayer"></a>

멀티플레이어 기능은 경험 제작에 있어 가장 흥미로운 부분이나, **한층 복잡한 작업**이기도 합니다.

참여자가 더 많아지는 즉시 플레이어가 상호작용하는 방식, 이러한 상호작용이 트리거하는 항목 및 해당 상호작용의 결과를 확인할 수 있는 사람을 결정할 때 고려해야 할 추가 ‘계층’이 도입됩니다.

이는 ‘동기화된’ 행동과 컴포넌트가 ‘동기화되지 않은’ 비헤이비어 및 컴포넌트와는 메시지를 주고받을 수 없기 때문입니다.

{% hint style="warning" %}
모든 행동, 컴포넌트, 툴에 동기화 기능이 있는 것은 아닙니다.
{% endhint %}

예를 들어, Rules 탭에서 생성된 퀘스트는 동기화되지 않으며 ‘Client Only(클라이언트 전용)’ 메시지로만 트리거될 수 있고 개별 플레이어들이 ‘로컬’로 완료할 수 있습니다.

이 문제를 해결하기 위해 이번 0.8 업데이트에서는 비헤이비어와 컴포넌트를 **Client Only \[SP]**&#xC640; **Synchronized \[MP]**&#xB85C; 구분했습니다.&#x20;

![클라이언트 전용 행동(왼쪽) / 동기화 행동(오른쪽)](https://4251931498-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MO_j99BJEXK4zHqxgqS%2Fuploads%2FUKcD7XomCvj3vnMSCD3O%2FBehaviour_Split_01.png?alt=media\&token=06eaacfd-9874-43e2-a7ba-5697e7849b1a)

**Client Only \[SP]** 비헤이비어와 컴포넌트는 ‘로컬’ 환경에서 작동합니다. 즉, 이들이 주고받는 메시지는 다른 ‘로컬’ 행동 및 컴포넌트에서만 수신 또는 전송됩니다. 퀘스트 진행 등의 이러한 메시지 및 변경 사항은 멀티플레이어 경험에서도 개별 플레이어에게만 발생합니다.

**Synchronized \[MP]** 비헤이비어와 컴포넌트는 ‘글로벌’ 환경에서 작동합니다. 즉, 액터 간 교환하는 메시지는 모든 플레이어에게 발생하며, 모든 플레이어는 이러한 메시지들의 결과로 발생하는 상태의 변경 사항을 확인할 수 있습니다.

**Collectable(수집) 컴포넌트**를 예시로 살펴보겠습니다.

이 컴포넌트는 ‘Client Only(클라이언트 전용)’ 또는 ‘Synchronized(동기화)’ 둘 중 한 가지를 선택할 수 있습니다.

**\[SP] Collectible**이 추가된 오브젝트가 수집될 경우 개별 플레이어가 플레이하고 있는 경험에서는 사라지지만, 다른 플레이어가 플레이하는 경험 속에서는 존재합니다. 이는 액터들의 ‘상태’ 변경이 개별 플레이어에게만 발생하기 때문입니다.

**\[MP] Collectible**이 추가된 오브젝트가 수집될 경우 오직 한 명의 플레이어만 해당 오브젝트를 수집할 수 있으며 이외 경험 내 나머지 모든 플레이어에게서 해당 오브젝트가 사라지게 됩니다. 이는 '액터들'의 상태 변경이 모든 플레이어에게 발생하기 때문입니다.

### 비헤이비어&컴포넌트 목록 <a href="#behaviours-and-components-list" id="behaviours-and-components-list"></a>

\[SP]/\[MP] 구분으로 비헤이비어 또는 컴포넌트 적용 시 고려해야 할 옵션이 거의 두 배로 늘어 어려움을 겪게 될지도 모릅니다.

아래의 차트를 통해 어떤 항목이 변경되었고 어디에 사용할 수 있는지 살펴보세요.

![행동과 컴포넌트 목록](https://4251931498-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MO_j99BJEXK4zHqxgqS%2Fuploads%2Fs5N4xFgOpWrWRQTQ71S7%2FBEHAVIOUR%20%2B%20COMPONENT%20SPREADSHEET.JPG?alt=media\&token=4258cfd6-8bcf-4430-9d7e-68fc6f9910d7)

{% hint style="danger" %}
위 표에서 회색으로 표시된 기존 비헤이비어와 컴포넌트는 멀티플레이어 경험과 호환되지 않으므로, <mark style="color:red;">**멀티플레이어 경험에서 사용하면 안 됩니다**</mark>.
{% endhint %}

{% hint style="warning" %}
멀티플레이어 경험에서 포팅되지 않은 ‘Client Only’ 비헤이비어와 컴포넌트를 사용하면 플레이어간 동기화가 제대로 이루어지지 않을 수 있습니다.
{% endhint %}

일부 항목은 ‘Synchronized’이지만 ‘Client Only’가 아님을 알 수 있습니다.

이러한 비헤이비어와 컴포넌트는 싱글플레이어 경험에서 사용할 수 없다는 의미가 아닌 개별 플레이어가 더 이상 고유하게 경험할 수 있는 버전이 없음을 의미합니다.

예를 들어, **Basic Platform은 ‘Client Only’로 사용할 수 없으며** 비헤이비어 창의 ‘Synchronized’ 필터를 통해서만 액세스할 수 있습니다. 여전히 싱글플레이어 경험에서 사용할 수 있지만, 다른 모든 플레이어가 이동 및 충돌을 사용할 수 있어야만 멀티플레이어 경험에서도 사용할 수 있습니다.

{% hint style="success" %}
일반적인 지침으로 멀티플레이어 경험에서 구현할 수 있는 ‘Client Only’의 사용 사례는 다음과 같습니다.

**Asker** 행동과의 대화, **Speaker** 및 **Indicator** 컴포넌트 알림, **Animated Decoration** 비헤이비어를 사용하는 작업에 대한 응답 및 **Message Broadcaster** 등의 행동에 의해 활성화되는 **퀘스트 목표**
{% endhint %}

### \[SP]/\[MP] 비헤이비어 및 컴포넌트 선택하기 <a href="#selecting-sp-or-mp-behaviours-and-components" id="selecting-sp-or-mp-behaviours-and-components"></a>

비헤이비어 또는 컴포넌트를 적용하기 위해 먼저 액터를 선택하고 속성 패널에서 비헤이비어 또는 컴포넌트를 클릭합니다.

팝업창이 나타나면 기본 보기에 먼저 ‘Client Only’ 변수가 표시되며, 이는 녹색 텍스트와 \[SP] 접두사로 구분할 수 있습니다.

{% hint style="warning" %}
회색 텍스트로 표시된 비헤이비어와 컴포넌트는 기본 보기에 표시되지만 멀티플레이어 경험과 호환되지 않으므로 싱글플레이어 경험에서만 사용해야 합니다.
{% endhint %}

‘*Synchronized*’ 버전의 비헤이비어 및 컴포넌트에 액세스하려면 팝업창 우측 상단 구석의 ‘***Type***’ 메뉴의 드롭다운을 클릭하고 ‘Synchronized’ 옵션을 선택합니다. 그러면 **\[MP] 접두사**가 붙은 노란색 텍스트로 표시된 항목들을 확인할 수 있습니다.

![](https://4251931498-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MO_j99BJEXK4zHqxgqS%2Fuploads%2F4BXkHtGKRaWTz16WFmfl%2FMP%20behaviours%20dropdown%20highlighted.png?alt=media\&token=2049854a-a06e-409e-9da2-76ff384d8186)

필요한 버전을 찾은 경우 해당 항목을 클릭하면 그 항목이 선택한 액터에 추가됩니다.

{% hint style="info" %}
향후 업데이트에서 모든 항목이 멀티플레이어로 호환되면 \[MP] 및 \[SP] 비헤이비어 및 컴포넌트를 식별하는 데 사용되는 텍스트 색상은 제거될 예정입니다.
{% endhint %}

{% hint style="warning" %}
오브젝트가 ‘Client Only’인지 ‘Synchronized’인지 장면에 표시되는 시각적인 표시기는 없습니다.
{% endhint %}

짚고 넘어가야 할 또다른 중요한 점은 바로 비헤이비어와 컴포넌트의 **\[MP]/\[SP] 변수는 동일한 액터에 존재할 수 없다는 사실입니다**. 즉, \[MP] Asker 비헤이비어가 추가된 엔티티에는 \[SP] Indicator 컴포넌트를 추가할 수 없습니다.

![](https://4251931498-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MO_j99BJEXK4zHqxgqS%2Fuploads%2FggEYelcZPwx53sP6dV1M%2F\[SP]%20\[MP]%20Split_Compatability.gif?alt=media\&token=6d5dd950-02fc-4eab-b3a8-f9c46074c16b)

대체 네트워크에서 비헤이비어 또는 컴포넌트를 선택할 시 다음 메시지가 표시됩니다.

"*<mark style="color:red;">**BLOCKED BY**</mark> <mark style="color:red;"></mark><mark style="color:red;">Network policy incompatible with another behaviour/component assigned to the actor/s (해당 액터에 할당된 다른 비헤이비어/컴포넌트와 호환되지 않는 네트워크 정책에 의해 차단됨).</mark>* "

![\[MP\] 행동이 추가된 액터에 \[SP\] 컴포넌트를 추가하려고 하면 발생하는 메시지](https://4251931498-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MO_j99BJEXK4zHqxgqS%2Fuploads%2F7kWhlNN19vvzNrfFX5ef%2FBehaviour%20Selection%20BLOCKED.JPG?alt=media\&token=95b75fed-ba88-498b-abbb-2218d3080e95)

이는 각 버전이 ‘클라이언트’ 환경 또는 ‘동기화된’ 환경과 상호 작용하도록 설계되었으며 둘을 모두 사용 시 충돌이 발생할 수 있기 때문입니다.

### 멀티플레이어 일관성 <a href="#multiplayer-consistency" id="multiplayer-consistency"></a>

잠재적인 오류와 비일관성을 줄이기 위해 액터의 ‘**Type**’이 일관적인지 확인해야 합니다.

즉, 단일 액터에 추가된 모든 컴포넌트와 비헤이비어는 ‘Client Only’이거나 ‘Synchronized’로 통일되어야 함을 말합니다.

#### 1️⃣ 통일된 유형 <a href="#id-1-consistent-type" id="id-1-consistent-type"></a>

특정 ‘***Type***’의 비헤이비어 및 컴포넌트가 단일 액터에 추가된 경우, 게임 메이커는 크리에이터가 비헤이비어 및 컴포넌트 창에서 다른 ‘Type’을 클릭할 수 없도록 하여 충돌 설정에 대한 액세스를 자동으로 제한합니다.

#### 2️⃣ 통일된 메시지 <a href="#id-2-consistent-messages" id="id-2-consistent-messages"></a>

액터의 ***커뮤니케이션*** 또한 일관성을 유지하는 것이 중요합니다. ‘Client Only’로 설정된 액터는 ‘Synchronized’ 액터로 메시지를 전송할 수 없으며, 그 반대의 경우도 동일합니다.

#### 3️⃣ 통일된 위계 <a href="#id-3-consistent-hierarchy" id="id-3-consistent-hierarchy"></a>

액터의 부모 자식 관계 또한 일관성을 유지해야 합니다. ‘Client Only’로 설정된 액터는 ‘Synchronized’로 설정된 액터의 자식이나 부모 관계가 될 수 없으며, 그 반대의 경우도 동일합니다.

#### 4️⃣ 통일된 생성 <a href="#id-4-consistent-spawn" id="id-4-consistent-spawn"></a>

**Asset Spawner** 비헤이비어, **Replace Asset** 비헤이비어, 또는 **Drop** 컴포넌트를 통해 경험 중 ‘생성된’ 액터는 ‘Spawner(생성기)’와 동일한 ‘*Type*’을 유지해야 합니다.

‘Synchronized’ 비헤이비어는 ‘Client Only’ 액터에 의해 생성될 수 없으며, 그 반대의 경우도 동일합니다.
