---
title: 멀티플레이
slug: world-sdk-guide-kr/fbtgRnsOwoMURtV767dXg
docTags: 
createdAt: 2024-09-03T08:56:14.553Z
---

ZEPETO 멀티플레이는 여러 사용자가 동시에 월드에 연결하고 플레이할 수 있는 모듈입니다.

서버/클라이언트 개발 및 로컬 테스트 환경을 제공합니다.

:::hint{type="info"}
�&#xDCD8;**&#x20;공식 멀티플레이 월드 샘플**

- GitHub: [https://github.com/naverz/zepeto-multiplay-example](https://github.com/naverz/zepeto-multiplay-example)
- 튜토리얼 : [멀티플레이 제작하기](docId\:S6aOeRnolpAc9cyQi_Onr)
:::

## 1단계 : 설치

왼쪽 상단의 \[프로젝트] 패널에서 \[+] 메뉴를 선택한 후 ZEPETO → 멀티플레이 서버를 선택하거나 자산 → 생성 → ZEPETO → 멀티플레이 서버로 이동합니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-j90fKsIuKZKfnVXabbkX0-20240904-102408.png)

World.multiplay 패키지는 다음 항목으로 구성되며, 월드가 게시될 때 자동으로 업데이트됩니다.

- index.ts: 서버 주요 로직 코드
- schemas: 서버/클라이언트 통신을 위한 데이터 구조

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-nizmsZpejlenvikndjCGs-20240904-102408.png)

:::hint{type="danger"}
❗&#xFE0F;**&#x20;주의**

게임당 하나의 World.multiplay 패키지만 생성할 수 있습니다.
:::


2단계: 설정
-------

아래 이미지에 표시된 \[Open World Settings]를 클릭하여 월드 설정을 합니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-NxzUiyO-mAN4iRpEu1j4t-20240904-102409.png)

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-RAyZ33qG5Bo2YwzysM7q7-20240904-102409.png)

| **속성**     | **설명**                       |
| ---------- | ---------------------------- |
| 버전         | 등록할 파일의 버전을 입력하세요.           |
| 최대 클라이언트 수 | 방에 접근할 수 있는 최대 인원 수를 설정합니다.  |
| 방향         | 화면의 방향을 선택하세요.               |
| 초대 비활성화    | 방 초대 기능을 비활성화합니다.            |
| 방 목록 비활성화  | 방 목록을 확인할 수 있는 기능을 비활성화합니다.  |
| 비공식 방 비활성화 | 비공식 방을 생성할 수 있는 기능을 비활성화합니다. |

:::hint{type="success"}
👍 **초대 비활성화&#x20;**

방 초대 기능이 꺼져 있어도 테스트 링크를 통해 초대를 보낼 수 있습니다.
:::

## 3단계 : 테스트 서버 실행

ZEPETO 멀티플레이는 제작자가 개발 중 서버/클라이언트를 테스트할 수 있는 로컬 서버 환경을 제공합니다.

로컬 서버 작업을 확인하려면 Unity 상단 메뉴 → 창 → ZEPETO → 멀티플레이 서버를 선택하여 서버 상태 창을 엽니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-PWJhKG6uCRjZFESqyE3SZ-20240904-102409.png)

편집기 화면 중앙의 \[▶︎(재생)] 버튼 옆에 있는 서버 버튼을 클릭합니다.

서버 상태 창에서 다음 서버 로그를 볼 수 있습니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-7Dgnzpk9znLihdOGT9XRa-20240904-102408.png)

## 4단계: 클라이언트에 연결하기(로컬 서버에 연결하기)

ZepetoWorldMultiplay 구성 요소는 클라이언트 측에서 사용되는 멀티플레이 관리자 클래스입니다.

계층 창에서 GameObject를 생성하고 ZepetoWorldMultiplay 구성 요소를 추가합니다.
ZepetoWorldMultiplay 구성 요소는 멀티플레이 패키지에 자동으로 연결됩니다.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-uHN55zN41rbDaB50lI2k5-20240904-102408.png)

편집기 화면 중앙에 있는 \[▶︎(재생)] 버튼을 클릭하여 서버 로그 창에서 클라이언트 연결 로그를 확인하세요.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-IfyrGQ-nhLDHN2mqQq1ZL-20240904-102408.png)

개발 서버는 localhost(127.0.0.1)에서 실행되며, 포트는 프로젝트가 처음 로드될 때 설정됩니다.

다중 프로젝트를 통해 연결할 때, 연결 환경을 다음과 같이 설정하세요.

:::hint{type="info"}
📘 **다음 가이드를 참조하세요&#x20;**[Multiplay IP 주소에 접속하기](docId\:OHE5RZcCF7NKtlDFID-PS) &#x20;
:::

:::hint{type="success"}
👍 **월드가 배포된 후, ZEPETO 서버에서 실행됩니다.**
:::

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-uFB-RnLTlviUOoDmKJSeC-20240904-102408.png)

## 5단계 : 서버 / 클라이언트 통신 기본 예제

**서버 로직 구현**

World.multiplay 패키지의 index.ts 파일은 서버의 주요 로직을 담당하는 코드입니다.

index.ts 파일을 열고, onCreate() 이벤트에서 메시지 유형 echo를 수신한 후 클라이언트에 전달되는 로직을 추가하세요.

:::hint{type="info"}
📘 **다음 가이드를 참조하세요 [\[Zepeto.Multiplay(서버) API\]](https://developer.zepeto.me/docs/multiplay-server/)**
:::

```javascript
import { Sandbox, SandboxOptions, SandboxPlayer } from 'ZEPETO.Multiplay';
import { Player } from 'ZEPETO.Multiplay.Schema';

export default class extends Sandbox {

    onCreate(options: SandboxOptions) {
        this.onMessage("echo", (client, message) => {
            console.log(`Echo onMessage from ${client.sessionId}, -> ${message}`);

            // 현재 클라이언트에게 전송
            client.send("echo", "보내는 사람에게 에코 : " + message);

            // 모든 연결된 클라이언트에게 방송
            this.broadcast("echo", "모두에게 에코 : " + message);
        });
    }

    onJoin(client: SandboxPlayer) {
        const player = new Player();
        player.sessionId = client.sessionId;
        player.userId = client.userId;
        const players = this.state.players;

        players.set(client.sessionId, player);

        console.log('onJoin!!!!');
    }

    onLeave(client: SandboxPlayer, consented?: boolean) {

    }
}
```

**클라이언트 로직 구현**

서버 이벤트를 전송/수신하는 데 사용되는 ZepetoWorldMultiplay GameObject에 ZEPETO 스크립트를 추가하십시오:

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-DcldiGM197lCXsHhBr-mE-20240904-102409.png)

:::CodeblockTabs
MultiplaySample.ts

```javascript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { ZepetoWorldMultiplay } from 'ZEPETO.World';
import { Room } from 'ZEPETO.Multiplay';

export default class MultiplaySample extends ZepetoScriptBehaviour {

    private _multiplay: ZepetoWorldMultiplay;

    Start() {
        this._multiplay = this.gameObject.GetComponent<ZepetoWorldMultiplay>();

        this._multiplay.RoomJoined += (room: Room) => {
            console.log(`RoomCreated, my session id is ${room.SessionId}`);

            // 서버에 메시지 전송
            room.Send("echo", "안녕하세요 ZEPETO 멀티플레이");

            // 서버 메시지 리스너 추가
            room.AddMessageHandler("echo", (message) => {
                // 서버 메시지 출력
                console.log(message);
            });
        };
    }
}
```
:::

:::hint{type="info"}
**📘&#x20;**&#xB2E4;음 가이드를 참조하십시오 [Multiplay Room Message](docId\:yT8T8XPljhsCnoR5Y4R7N)&#x20;
:::

## 6단계 : 출력 결과 테스트

편집기 화면 중앙의 \[▶︎(재생)]을 클릭하여 서버/클라이언트를 실행하십시오. 아래와 같이 '에코' 유형 메시지의 예를 볼 수 있어야 합니다:

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-eoerpE3tTBr0iPMd6OTlt-20240904-102408.png)

① 클라이언트 메시지가 서버에 수신될 때의 출력 로그입니다.

② 클라이언트에서 서버로부터 수신된 메시지의 로그입니다.


서버 코드 사용 시 주의사항
===============

:::hint{type="danger"}
**&#x20;❗️ 주의**

**\[서버 코드 내 변수 사용]**

- 변수는 서버 코드 내에서도 선언할 수 있습니다.
- 그러나 서버에서 사용할 수 있는 캐시 메모리는 현재 512KB로 제한되어 있습니다. (이것은 나중에 변경될 수 있습니다.)
- 512KB를 초과하면 방이 숨겨질 수 있으므로 이를 염두에 두고 개발해 주시기 바랍니다.

**\[서버 코드 내 루프 사용]**

- 서버 코드에서 루프 시간 제한은 2초(2000ms)로 설정되어 있습니다.
- 블로킹 코드나 장시간 실행되는 루프를 사용하면 루프 시간 제한으로 인해 프로그램이 올바르게 실행되지 않을 수 있으므로 개발 시 이를 고려해 주시기 바랍니다.
:::

