# PlayDrop 게임을 위한 AI 에셋 생성

PlayDrop에서 게임용 이미지, 음악, 효과음, 음성, 동영상, 3D 모델을 만드세요. 브라우저에서는 플레이어가 확인하고, 게임 서버에서는 크리에이터가 비용을 냅니다.

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

PlayDrop은 이미지, 음악, 효과음, 음성, 동영상, 3D 모델을 생성할 수 있습니다. 게임을 만드는 동안 사용하거나, 게임 안에서 사용해 플레이어가 생성된 콘텐츠를 받게 할 수 있습니다.

## 게임을 만드는 동안

로그인한 크리에이터는 PlayDrop 웹사이트의 만들기에서 에셋(이미지, 음악, 사운드, 음성, 동영상, 3D)을 생성하거나, 게임을 만드는 중에 PlayDrop Cloud에 요청할 수 있습니다. 생성할 때마다 시작 전에 표시되는 크레딧이 들며, 결과물은 내가 소유하는 에셋이 됩니다. 다른 에셋과 똑같이 사용하세요. 패키지에 내려받아 넣거나 `uses`에서 참조하면 됩니다([게임 에셋](https://www.playdrop.ai/ko/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/ko/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/ko/create/learn/game-assets): PlayDrop 게임에 이미지, 사운드, 동영상, 3D를 담아 보내세요. 포함 파일, catalogue.json에 선언한 게임 소유 에셋, 공개 에셋과 팩, sdk.assets 런타임 조회를 다룹니다.
- [실시간 게임 서버](https://www.playdrop.ai/ko/create/learn/game-servers): MongoDB 데이터베이스가 있는 호스팅 Colyseus 0.17 서버를 게임에 쓰고, SDK로 브라우저에서 연결하고, 플레이어 2명으로 테스트하고, 제한 사항을 알아보세요.
- [수익화](https://www.playdrop.ai/ko/create/learn/monetization): requestReview로 리뷰를 요청하고, 팁을 받고, sdk.shop으로 아이템을 판매하고, 전면 광고와 보상형 광고를 보여 주고, 크리에이터가 받는 몫을 알아보세요.
