# 为 PlayDrop 游戏生成 AI 素材

在 PlayDrop 中为游戏生成图片、音乐、音效、语音、视频和 3D 模型：可在浏览器中经玩家确认后生成，也可由游戏服务器生成并由创作者付费。

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

PlayDrop 可以生成图片、音乐、音效、语音、视频和 3D 模型。你可以在制作游戏时使用，也可以在游戏中使用，让玩家获得生成的内容。

## 制作游戏时

已登录的创作者可以在 PlayDrop 网站的“创作”中生成素材（图片、音乐、音效、语音、视频和 3D），也可以在制作游戏时让 PlayDrop Cloud 生成。每次生成都会花费点数，费用会在开始前显示，生成结果会成为你拥有的素材。像使用其他素材一样使用它：下载到你的包中，或在 `uses` 中引用（[游戏素材](https://www.playdrop.ai/zh-hans/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，调用会返回 `app_ai_generation_disabled`。请改用服务器。
- 请由玩家操作触发，在 `play` 阶段调用，并处理取消的情况。

## 在游戏中：从服务器生成

在[游戏服务器](https://www.playdrop.ai/zh-hans/create/learn/game-servers)上，`@playdrop/server` 提供的 `playdrop.ai` 可以生成文本、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/zh-hans/create/learn/game-assets): 随 PlayDrop 游戏提供图片、声音、视频和 3D：内置文件、在 catalogue.json 中声明的游戏自有素材、公开素材和素材包，以及用 sdk.assets 在运行时查找。
- [实时游戏服务器](https://www.playdrop.ai/zh-hans/create/learn/game-servers): 为你的游戏运行托管的 Colyseus 0.17 服务器和 MongoDB 数据库，用 SDK 从浏览器连接，用两位玩家测试，并了解各项限制。
- [变现](https://www.playdrop.ai/zh-hans/create/learn/monetization): 用 requestReview 邀请评价，接收打赏，用 sdk.shop 出售物品，展示插屏广告和激励广告，并了解创作者从每种方式中获得的分成。
