# การสร้างแอสเซ็ตด้วย AI สำหรับเกม PlayDrop

สร้างภาพ เพลง เสียง เสียงพูด วิดีโอ และ 3D ให้เกมใน PlayDrop จากเบราว์เซอร์โดยให้ผู้เล่นยืนยัน หรือจากเซิร์ฟเวอร์โดยครีเอเตอร์เป็นผู้จ่าย

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

PlayDrop สร้างภาพ เพลง เอฟเฟกต์เสียง เสียงพูด วิดีโอ และโมเดล 3D ได้ ใช้ระหว่างสร้างเกม หรือใช้ภายในเกมเพื่อให้ผู้เล่นได้รับเนื้อหาที่สร้างขึ้น

## ระหว่างสร้างเกม

ครีเอเตอร์ที่เข้าสู่ระบบสร้างแอสเซ็ตได้จากหน้าสร้างบนเว็บไซต์ PlayDrop (ภาพ เพลง เสียง เสียงพูด วิดีโอ และ 3D) หรือขอจาก PlayDrop Cloud ระหว่างสร้างเกม การสร้างแต่ละครั้งใช้เครดิต ซึ่งจะแสดงก่อนเริ่ม และผลลัพธ์จะเป็นแอสเซ็ตที่คุณเป็นเจ้าของ ใช้เหมือนแอสเซ็ตอื่นๆ ได้เลย: ดาวน์โหลดเข้าแพ็กเกจของคุณ หรืออ้างอิงใน `uses` ([แอสเซ็ตเกม](https://www.playdrop.ai/th/create/learn/game-assets))

## ภายในเกม: จากเบราว์เซอร์

`sdk.ai.<kind>.createTask(request)` ขอให้ PlayDrop สร้างสื่อให้ผู้เล่นปัจจุบัน PlayDrop จะแสดงหน้ายืนยันพร้อมค่าเครดิตให้ผู้เล่น ผู้เล่นเป็นผู้จ่าย และผลลัพธ์เป็นของผู้เล่นคนนั้นแบบส่วนตัว

```js
try {
  const task = await sdk.ai.image.createTask({ input: "A friendly robot pet, flat colors", aspectRatio: "1:1" });
  const done = await waitForTask(task.id);
  const blob = await sdk.ai.tasks.downloadFile(done.id);
  showPet(URL.createObjectURL(blob));
} catch (error) {
  if (error.message === "ai_generation_cancelled") return;
  throw error;
}

async function waitForTask(id) {
  for (;;) {
    const task = await sdk.ai.tasks.get(id);
    if (task.status === "DONE") return task;
    if (["FAILED", "CANCELLED", "EXPIRED"].includes(task.status)) throw new Error(task.status);
    await new Promise((resolve) => setTimeout(resolve, 2000));
  }
}
```

- ชนิดที่รองรับ: `image`, `music`, `sfx`, `speech`, `video` และ `model3d` ส่วน `sdk.ai.inputs.upload(blob)` ใช้ส่งภาพอ้างอิง
- เปิดหน้ายืนยันได้ครั้งละหนึ่งหน้าเท่านั้น การเรียกครั้งที่สองจะถูกปฏิเสธด้วย `ai_generation_in_progress`
- การสร้างข้อความและ JSON จากเบราว์เซอร์ใช้ไม่ได้กับเกมที่โฮสต์บน PlayDrop และจะส่งคืน `app_ai_generation_disabled` ให้ใช้เซิร์ฟเวอร์แทน
- เรียกจากการกระทำของผู้เล่นในช่วง `play` และจัดการกรณีที่ผู้เล่นยกเลิก

## ภายในเกม: จากเซิร์ฟเวอร์

บน[เซิร์ฟเวอร์เกม](https://www.playdrop.ai/th/create/learn/game-servers) `playdrop.ai` จาก `@playdrop/server` สร้างข้อความ JSON ภาพ เพลง เอฟเฟกต์เสียง เสียงพูด วิดีโอ และ 3D ได้ ครีเอเตอร์เป็นผู้จ่ายและเป็นเจ้าของผลลัพธ์โดยค่าเริ่มต้น ส่ง `{ owner: client.auth }` เพื่อมอบผลลัพธ์ที่เข้าเกณฑ์ให้เป็นของผู้เล่นคนนั้น

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

const task = await playdrop.ai.speech.createTask({ input: "Welcome back, captain." }, { owner: client.auth });
// Later, once the task is DONE:
const file = await playdrop.ai.tasks.downloadFile(task.id, { role: "primary" });
client.send("speech", { bytes: new Uint8Array(await file.arrayBuffer()), contentType: file.type });
```

- ไฟล์ที่สร้างขึ้นเป็นไฟล์ส่วนตัว: ดาวน์โหลดบนเซิร์ฟเวอร์และส่งไบต์ให้เฉพาะผู้เล่นที่ตั้งใจเท่านั้น
- คำขอเสียงพูดรับได้ไม่เกิน 40 คำ
- สิ่งที่ผู้เล่นทดสอบสร้างยังเป็นของครีเอเตอร์และทำงานในโหมดทดสอบ
- การเรียกเหล่านี้ใช้ได้กับเกมที่อัปโหลดแล้ว ไม่ใช่ในการพัฒนาในเครื่อง

การสร้างใช้เครดิต จึงควรจำกัดความถี่ที่ผู้เล่นสั่งสร้างได้ และพิสูจน์ให้ได้ว่าคำขอหนึ่งครั้งทำงานครบ ตั้งแต่สร้างงานไปจนถึงผู้เล่นได้เห็นหรือได้ยินผลลัพธ์จริง ก่อนจะสร้างเกมทั้งเกมโดยอาศัยสิ่งนี้

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

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