# Format aset kustom dan kreasi pemain di PlayDrop

Buat format aset sendiri, nyatakan format yang dibaca atau ditulis game, dan biarkan pemain menyimpan serta menerbitkan kreasi lewat sdk.assets.custom.

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

Spesifikasi aset memungkinkan game menentukan jenis asetnya sendiri, seperti level, karakter, atau dek, sebagai kontrak berkas. Pemain lalu bisa membuat, menyimpan, dan menerbitkan kreasi dalam format itu, dan game lain yang mendukungnya bisa membukanya.

## Tentukan spesifikasi aset

Spesifikasi aset dideklarasikan di daftar `assetSpecs` di catalogue.json, di samping `apps`:

```json
{
  "assetSpecs": [{
    "name": "moon-level",
    "version": "1.0.0",
    "displayName": "Moon Jump level",
    "symbol": "specs/moon-level.svg",
    "contract": "specs/moon-level.contract.json"
  }]
}
```

Kontrak menyebutkan berkas setiap aset dan cara memeriksanya:

```json
{
  "primaryRole": "level",
  "roles": [
    { "name": "level", "required": true, "contentTypes": ["application/json"], "mode": "TEXT",
      "jsonSchema": { "type": "object", "required": ["tiles"], "properties": { "tiles": { "type": "array" } } } },
    { "name": "thumbnail", "required": false, "contentTypes": ["image/png"], "mode": "BINARY" }
  ]
}
```

Peran boleh membawa JSON Schema, yang diperiksa PlayDrop setiap kali disimpan. Terbitkan versi spesifikasi baru saat formatnya berubah; aset lama tetap memakai versinya.

## Nyatakan apa yang didukung game

```json
{
  "assetSpecSupport": [
    { "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
  ]
}
```

Kemampuan yang tersedia adalah `READ`, `WRITE`, `EDIT`, `PREVIEW`, dan `IMPORT`.

## Simpan dan muat kreasi pemain

```js
const levels = sdk.assets.custom.forSpec("asset-spec:your-name/moon-level");

await levels.saveDraft({ assetName: "crater-run", displayName: "Crater run",
  files: { level: new Blob([JSON.stringify(level)], { type: "application/json" }) } });
await levels.publish({ assetName: "crater-run", displayName: "Crater run", files: { level: levelBlob, thumbnail: pngBlob } });

const mine = await levels.listMine();
const latest = mine[0]?.latestPublicVersion;
if (latest) startLevel(await levels.loadJson({ assetRef: latest.assetRef, role: "level" }));

const community = await levels.listPublic({ limit: 20 }); // { assets, pagination }
```

- `saveDraft` menyimpan draf privat; `publish` menjadikannya publik. Keduanya memerlukan set berkas yang lengkap.
- Referensi aset berbentuk seperti `asset:creator/name@r2`. `loadJson`, `loadText`, dan `downloadFile` membaca aset yang sudah diterbitkan; `loadOwned`, `loadOwnedJson`, dan `loadOwnedFile` membaca aset milik pemain sendiri, termasuk draf.
- `supports(versionRef, capability)` memeriksa dukungan sebelum membuka aset dari versi lain.
- Kesalahan memakai kode seperti `custom_asset_capability_unsupported` dan `custom_asset_role_type_mismatch`.

Pemain harus masuk untuk menyimpan. Tinjau apa yang diterbitkan pemain seperti Anda meninjau konten pengguna lainnya: kebijakan konten PlayDrop berlaku untuknya.

## Apa yang diterima konektor

Aset dan spesifikasi kustom yang hanya berisi data diunggah seperti berkas lainnya. Model yang dapat dieksekusi, yaitu aset `MODEL_3D` dengan subkategori `procedural` atau format `CUSTOM`, ditolak oleh konektor karena API tidak menjalankan kode kreator; bake model tersebut atau rujuk versi yang sudah diterbitkan. Lihat [aset game](https://www.playdrop.ai/id/create/learn/game-assets).

## Panduan terkait

- [Aset game](https://www.playdrop.ai/id/create/learn/game-assets): Sertakan gambar, suara, video, dan 3D di game PlayDrop: berkas bawaan, aset milik game, aset serta pack publik, dan pencarian lewat sdk.assets.
- [catalogue.json](https://www.playdrop.ai/id/create/learn/catalogue-json): Field catalogue.json yang dipakai game PlayDrop: identitas, listingan, mode bermain, permukaan, login, Instan, pramuat, media, terjemahan, skor, dan server.
- [SDK klien](https://www.playdrop.ai/id/create/learn/sdk): Referensi SDK browser: init, siklus hidup host, identitas, simpanan, perangkat, sosial, multiplayer, toko, iklan, papan peringkat, pencapaian, aset, dan AI.
