# ปาร์ตี้ออนไลน์และแชทเสียงในเกม PlayDrop

ให้เพื่อนเล่นด้วยกันออนไลน์: ประกาศขนาดปาร์ตี้ เปิดหน้าต่างปาร์ตี้ของ PlayDrop เข้าห้องที่จองไว้ด้วย sdk.multiplayer.join และควบคุมแชทเสียงในห้อง

Source: https://www.playdrop.ai/th/create/learn/online-party

ปาร์ตี้ PlayDrop คือกลุ่มเพื่อนที่ย้ายไปเล่นเกมต่างๆ ด้วยกัน เมื่อปาร์ตี้เริ่มเกมของคุณ PlayDrop จะจองที่นั่งให้สมาชิกในห้องหนึ่งของเซิร์ฟเวอร์คุณ เพื่อให้เพื่อนเข้ามาอยู่ในแมตช์เดียวกันแทนที่จะถูกแยกกัน แชทเสียงทำงานใน PlayDrop ไม่ใช่ในเกมของคุณ

## สิ่งที่ต้องมี

- [เซิร์ฟเวอร์เกมเรียลไทม์](https://www.playdrop.ai/th/create/learn/game-servers): ปาร์ตี้เล่นในห้อง Colyseus ของคุณ
- ผู้เล่นที่เข้าสู่ระบบแล้ว: ห้องปฏิเสธผู้เยี่ยมชม
- การประกาศเหล่านี้ใน [catalogue.json](https://www.playdrop.ai/th/create/learn/catalogue-json):

```json
{
  "types": ["solo", "online", "party"],
  "party": { "online": [2, 3, 4] },
  "roomVoice": true,
  "server": { "entry": "server/index.mjs", "rooms": ["game"] }
}
```

`party.online` ระบุขนาดกลุ่มที่แน่ชัด สูงสุด 4 คน ที่เข้ามาด้วยกันได้ `[2, 4]` ไม่รวม 3 ค่านี้คือขนาดของกลุ่มที่เข้ามา ไม่ใช่ความจุของห้อง: ปาร์ตี้สี่คนสองปาร์ตี้ใช้ห้องแปดที่นั่งร่วมกันได้ `party` ต้องมีประเภท `party` และ `party.online` ต้องมี `online` ส่วน `roomVoice: true` เปิดแชทเสียงในห้องและต้องมี `online`

## เข้าห้องที่ถูกต้อง

```js
if (!sdk.me.isLoggedIn) {
  await sdk.me.promptLogin();
}
const room = await sdk.multiplayer.join("game", { mode: "versus" });
```

`join` ใช้ที่นั่งปาร์ตี้ที่จองไว้ให้ผู้เล่นเมื่อ PlayDrop เป็นผู้เปิดเกมให้ปาร์ตี้ หากไม่ใช่จะเข้าร่วมแบบอิสระ หากการเข้าร่วมของปาร์ตี้ล้มเหลว ฟังก์ชันจะปฏิเสธ และไม่ย้ายผู้เล่นไปห้องอื่นอย่างเงียบๆ ผู้เยี่ยมชมจะได้รับ `authentication_required` และ PlayDrop จะแสดงหน้าเข้าสู่ระบบ ให้เข้าร่วมอีกครั้งจาก `sdk.me.onAuthChange` ใช้ห้องเดิมตลอดทุกรอบ

หลังโหลดหน้าใหม่ `sdk.multiplayer.reconnect(roomName, token)` จะคืนที่นั่งที่จองไว้ด้วยโทเค็นสำหรับเชื่อมต่อกลับ (reconnection token) ที่คุณเก็บไว้แบบส่วนตัวสำหรับเกม เวอร์ชัน และผู้ใช้นี้ ทิ้งโทเค็นแล้วเรียก `join` เมื่อได้ `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` หรือ `party_reconnect_mismatch`

## หน้าต่างปาร์ตี้

จากปุ่มในเกม `sdk.social.openParty({ mode: "online" })` จะเปิดหน้าต่างปาร์ตี้ของ PlayDrop ซึ่งผู้เล่นเชิญเพื่อนและเปิดหรือปิดแชทเสียงได้ หากมีปาร์ตี้อยู่แล้วจะใช้ปาร์ตี้นั้นต่อ `openParty()` เปิดเมนูปาร์ตี้ และ `openParty({ section: "voice" })` เปิดการตั้งค่าแชทเสียง อย่าใช้ `mode` กับ `section` ร่วมกัน promise จะเสร็จสิ้นเมื่อหน้าต่างปิด รวมถึงเมื่อยกเลิก

อ่านข้อมูลปาร์ตี้ด้วย `sdk.social.getParty()` หรือ `sdk.social.onPartyChange(callback)` ซึ่งส่งสถานะปัจจุบันมาก่อน: `{ partyId, leaderUserId, revision, members, launch }` `launch.status` เป็น `joining` หรือ `ready` เมื่อปาร์ตี้กำลังเล่นเกมนี้ การเป็นสมาชิกอย่างเดียวไม่ได้หมายความว่าผู้เล่นอยู่ห้องเดียวกัน ให้ใช้ `join`

การเป็นสมาชิกปาร์ตี้เป็นของ PlayDrop: เกมเพิ่มหรือนำสมาชิกออกจากปาร์ตี้ไม่ได้ และควบคุมไมโครโฟนไม่ได้ ผู้เล่นเชิญเพื่อนเข้าปาร์ตี้จากหน้าต่างนี้ เกมยังส่งการ์ดคำเชิญหรือการ์ดท้าแข่งของตัวเองให้เพื่อนได้ด้วย `sdk.social.sendMessage` ดู[การแชร์ เพื่อน และคำเชิญ](https://www.playdrop.ai/th/create/learn/social)

## แชทเสียงในห้อง

เมื่อตั้ง `roomVoice: true` ทุกคนในห้องคุยกันได้โดยไม่ต้องมีโค้ดเซิร์ฟเวอร์ หากต้องการเปลี่ยนว่าใครได้ยินใคร ให้ผูกห้องบนเซิร์ฟเวอร์และตั้งนโยบาย:

```js
import { playdrop } from "@playdrop/server";

const platform = playdrop.multiplayer.forRoom(this);
platform.voice.setPolicy("team");
platform.voice.setTeam(client.auth, "red");
```

นโยบายมี `all`, `team`, `proximity` (พร้อม `{ range }`) และ `off` `setAudience(player, audience)` กำหนดค่าเฉพาะผู้เล่นหนึ่งคน และ `updatePositions([{ player, position: { x, y, z } }])` ส่งตำแหน่งให้โหมดความใกล้เคียง ส่ง `null` เพื่อล้างทีมหรือค่าเฉพาะผู้เล่น PlayDrop เป็นผู้บังคับว่าใครได้ยินใคร ในเบราว์เซอร์ `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` ปรับได้เฉพาะระดับเสียงและการแพน

แชทเสียงขึ้นกับความยินยอม การปิดเสียง และการบล็อกของผู้เล่น และขึ้นกับบิลด์ของโฮสต์และการเปิดใช้งานแบบทยอย

## การหยุดชั่วคราว

แคปซูลปาร์ตี้ไม่ได้หยุดการเล่น การหยุดชั่วคราวของ PlayDrop หยุดไคลเอนต์ของคุณ แต่ห้องยังเชื่อมต่ออยู่และเซิร์ฟเวอร์ยังทำงานต่อ การหยุดของผู้เล่นคนหนึ่งต้องไม่ทำให้แมตช์หยุดสำหรับคนอื่น หากต้องการหยุดแมตช์ ให้ทำบนเซิร์ฟเวอร์

## ทดสอบ

อัปโหลดเวอร์ชันส่วนตัว แล้วเปิดลิงก์ทดสอบในสองหน้าต่างด้วย `player=1` และ `player=2` ตามที่อธิบายไว้ใน[เซิร์ฟเวอร์เกมเรียลไทม์](https://www.playdrop.ai/th/create/learn/game-servers) ปาร์ตี้ในเครื่องที่ใช้คอนโทรลเลอร์เป็นอีกโหมดหนึ่ง: ดู[ปาร์ตี้ในเครื่องและคอนโทรลเลอร์](https://www.playdrop.ai/th/create/learn/local-party)

## คู่มือที่เกี่ยวข้อง

- [เซิร์ฟเวอร์เกมเรียลไทม์](https://www.playdrop.ai/th/create/learn/game-servers): รันเซิร์ฟเวอร์ Colyseus 0.17 ที่โฮสต์ให้พร้อมฐานข้อมูล MongoDB สำหรับเกมของคุณ เชื่อมต่อจากเบราว์เซอร์ด้วย SDK ทดสอบด้วยผู้เล่นสองคน และรู้ขีดจำกัด
- [ปาร์ตี้ในเครื่องและคอนโทรลเลอร์](https://www.playdrop.ai/th/create/learn/local-party): อ่านเกมแพดจริงและคอนโทรลเลอร์บนโทรศัพท์ของ PlayDrop ผ่าน sdk.device ติดตามช่องผู้เล่นในเครื่อง ประกาศการรองรับคอนโทรลเลอร์และขนาดปาร์ตี้ในเครื่อง
- [การแชร์ เพื่อน และคำเชิญ](https://www.playdrop.ai/th/create/learn/social): แชร์เกมพร้อมภาพหรือคลิป อ่านข้อมูลแนบตอนเปิดเกม เลือกเพื่อน ส่งการ์ดคำเชิญและการ์ดท้าแข่งใน PlayDrop Chat และแนะนำเกมอื่น
