---
title: มัลติเพลย์
slug: world-sdk-guide-th/Cdir1ZjocSeSZ6Q6X0JRZ
docTags: 
createdAt: 2024-09-03T08:56:14.553Z
---

ZEPETO Multiplay เป็นโมดูลที่อนุญาตให้ผู้ใช้หลายคนเชื่อมต่อและเล่นโลกพร้อมกันได้

มันให้การพัฒนาเซิร์ฟเวอร์/ไคลเอนต์และสภาพแวดล้อมการทดสอบในท้องถิ่น

:::hint{type="info"}
�&#xDCD8;**&#x20;ตัวอย่างโลก Multiplay อย่างเป็นทางการ**

- GitHub: [https://github.com/naverz/zepeto-multiplay-example](https://github.com/naverz/zepeto-multiplay-example)
- บทเรียน : [บทเรียนการเล่นหลายคน](docId\:bFzI_crxT7X2ujbo1ZNog)
:::

## ขั้นตอนที่ 1 : ติดตั้ง

เลือก ZEPETO → เซิร์ฟเวอร์ Multiplay ในเมนู \[+] ที่มุมซ้ายบนของแผง \[Project] หรือไปที่ Assets → สร้าง → ZEPETO → เซิร์ฟเวอร์ Multiplay

![](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 : การตั้งค่า
-------------------------

คลิกที่ \[เปิดการตั้งค่าโลก] ตามที่แสดงในภาพด้านล่างเพื่อกำหนดการตั้งค่าโลก

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

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

| **ทรัพย์สิน**  | **คำอธิบาย**                                     |
| -------------- | ------------------------------------------------ |
| เวอร์ชัน       | กรอกเวอร์ชันของไฟล์ของคุณที่จะลงทะเบียน.         |
| MaxClients     | ตั้งค่าจำนวนสูงสุดของผู้ที่สามารถเข้าถึงห้องได้. |
| การจัดแนว      | เลือกการจัดแนวของหน้าจอ.                         |
| ปิดการเชิญ     | ปิดฟังก์ชันการเชิญห้อง.                          |
| ปิดรายการห้อง  | ปิดความสามารถในการตรวจสอบรายการห้อง.             |
| ปิดห้องส่วนตัว | ปิดความสามารถในการสร้างห้องส่วนตัว.              |

:::hint{type="success"}
👍 **ปิดการเชิญ&#x20;**

แม้ว่าฟังก์ชันการเชิญห้องจะปิดอยู่ คุณยังสามารถส่งคำเชิญผ่านลิงก์ทดสอบได้.
:::

## ขั้นตอนที่ 3 : การรันเซิร์ฟเวอร์ทดสอบ

ZEPETO Multiplay ให้สภาพแวดล้อมเซิร์ฟเวอร์ท้องถิ่นที่ผู้สร้างสามารถทดสอบเซิร์ฟเวอร์/ไคลเอนต์ระหว่างการพัฒนาได้

เพื่อตรวจสอบการทำงานของเซิร์ฟเวอร์ท้องถิ่น ให้เลือกเมนูด้านบนของ Unity → Window → ZEPETO → Multiplay Server เพื่อเปิดหน้าต่างสถานะเซิร์ฟเวอร์.

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

คลิกปุ่มเซิร์ฟเวอร์ถัดจากปุ่ม \[▶︎(เล่น)] ที่อยู่กลางหน้าจอของโปรแกรมแก้ไข.

คุณจะเห็นบันทึกเซิร์ฟเวอร์ต่อไปนี้ที่แผงสถานะเซิร์ฟเวอร์

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

## ขั้นตอนที่ 4 : เชื่อมต่อกับลูกค้า (เชื่อมต่อกับเซิร์ฟเวอร์ท้องถิ่น)

ส่วนประกอบ ZepetoWorldMultiplay เป็นคลาสผู้จัดการ Multiplay ที่ใช้ในฝั่งลูกค้า

สร้าง GameObject ในหน้าต่าง Hierachy และเพิ่มส่วนประกอบ ZepetoWorldMultiplay
ส่วนประกอบ ZepetoWorldMultiplay จะเชื่อมต่อกับแพ็คเกจ Multiplay โดยอัตโนมัติ

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

คลิกที่ปุ่ม \[▶︎(เล่น)] ที่กลางหน้าจอ Editor เพื่อดูบันทึกการเชื่อมต่อของลูกค้าในหน้าต่าง Server Log.

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

เซิร์ฟเวอร์พัฒนาทำงานบน localhost(127.0.0.1) และพอร์ตจะถูกตั้งค่าเมื่อโปรเจกต์ถูกโหลดครั้งแรก.

เมื่อเชื่อมต่อผ่านหลายโปรเจกต์ ให้ตั้งค่าสภาพแวดล้อมการเชื่อมต่อเป็นดังนี้

:::hint{type="info"}
📘 **กรุณาอ้างอิงจากคู่มือต่อไปนี้&#x20;**[กำลังเข้าถึงที่อยู่ IP หลายรายการ](docId\:gMHdiIdyBSPtFEsqs7bqc) &#x20;
:::

:::hint{type="success"}
👍 **หลังจากที่โลกถูกแจกจ่าย มันจะทำงานบนเซิร์ฟเวอร์ ZEPETO.**
:::

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

## ขั้นตอนที่ 5 : ตัวอย่างการสื่อสารระหว่างเซิร์ฟเวอร์ / ไคลเอนต์

**การนำตรรกะเซิร์ฟเวอร์ไปใช้**

ไฟล์ index.ts ในแพ็คเกจ World.multiplay เป็นโค้ดที่รับผิดชอบตรรกะหลักของเซิร์ฟเวอร์

เปิดไฟล์ index.ts และเพิ่มตรรกะที่ส่งไปยังไคลเอนต์หลังจากได้รับประเภทข้อความ echo ในเหตุการณ์ onCreate()

:::hint{type="info"}
📘 **กรุณาอ้างอิงจากคู่มือต่อไปนี้ [\[Zepeto.Multiplay(Server) 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", "echo to sender : " + message);

            // กระจายไปยังไคลเอนต์ที่เชื่อมต่อทั้งหมด
            this.broadcast("echo", "echo to all : " + 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) {

    }
}
```

**การดำเนินการตรรกะของลูกค้า**

สร้างและเพิ่มสคริปต์ ZEPETO ใน GameObject ZepetoWorldMultiplay ที่ใช้ในการส่ง/รับเหตุการณ์จากเซิร์ฟเวอร์ดังนี้:

![](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 Multiplay");

            // เพิ่มผู้ฟังข้อความจากเซิร์ฟเวอร์
            room.AddMessageHandler("echo", (message) => {
                // พิมพ์ข้อความจากเซิร์ฟเวอร์
                console.log(message);
            });
        };
    }
}
```
:::

:::hint{type="info"}
**📘&#x20;**&#xE01;รุณาอ้างอิงจากคู่มือต่อไปนี้ [ข้อความในห้องเล่นหลายคน](docId:80Px4FCTALLbpG9V1PnCX)&#x20;
:::

## ขั้นตอนที่ 6 : ทดสอบผลลัพธ์การส่งออก

คลิกที่ \[▶︎(เล่น)] ที่กลางหน้าจอ Editor เพื่อเรียกใช้เซิร์ฟเวอร์/ลูกค้า คุณควรเห็นตัวอย่างข้อความประเภท 'echo' ดังที่แสดงด้านล่าง:

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

① บันทึกของผลลัพธ์เมื่อข้อความจากลูกค้าถูกส่งไปยังเซิร์ฟเวอร์

② บันทึกของข้อความที่ได้รับจากเซิร์ฟเวอร์จากลูกค้า


ข้อควรระวังเมื่อใช้โค้ดเซิร์ฟเวอร์
==================================

:::hint{type="danger"}
**&#x20;❗️ ระวัง**

**\[การใช้ตัวแปรภายในโค้ดเซิร์ฟเวอร์]**

- สามารถประกาศตัวแปรในโค้ดเซิร์ฟเวอร์ได้เช่นกัน
- อย่างไรก็ตาม หน่วยความจำแคชที่มีอยู่ในเซิร์ฟเวอร์ในขณะนี้จำกัดอยู่ที่ 512KB (อาจมีการเปลี่ยนแปลงในภายหลัง)
- หากเกิน 512KB ห้องอาจถูกซ่อน ดังนั้นโปรดพัฒนาตามนี้

**\[การใช้ลูปภายในโค้ดเซิร์ฟเวอร์]**

- เวลาลูปถูกตั้งไว้ที่ 2 วินาที (2000ms) ในโค้ดเซิร์ฟเวอร์
- โปรดพิจารณานี้เมื่อพัฒนา เนื่องจากการใช้โค้ดที่บล็อกหรือการลูปที่ใช้เวลานานอาจทำให้โปรแกรมไม่สามารถทำงานได้อย่างถูกต้องเนื่องจากเวลาลูปที่กำหนด
:::

