# Eigene Asset-Formate und Spielerkreationen auf PlayDrop

Eigenes Asset-Format definieren, unterstützte Formate angeben und Spieler Level, Figuren und mehr mit sdk.assets.custom speichern und veröffentlichen lassen.

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

Mit Asset-Spezifikationen kann ein Spiel eine eigene Art von Asset definieren, etwa ein Level, eine Figur oder ein Kartendeck, als Vertrag über Dateien. Spieler können dann Kreationen in diesem Format erstellen, speichern und veröffentlichen, und andere Spiele, die das Format unterstützen, können sie öffnen.

## Asset-Spezifikation definieren

Eine Asset-Spezifikation wird in der Liste `assetSpecs` der catalogue.json deklariert, neben `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"
  }]
}
```

Der Vertrag benennt die Dateien jedes Assets und legt fest, wie sie geprüft werden:

```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" }
  ]
}
```

Rollen können ein JSON Schema enthalten, das PlayDrop bei jedem Speichern prüft. Veröffentliche eine neue Version der Spezifikation, wenn sich das Format ändert; alte Assets behalten ihre Version.

## Angeben, was ein Spiel unterstützt

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

Die möglichen Fähigkeiten sind `READ`, `WRITE`, `EDIT`, `PREVIEW` und `IMPORT`.

## Spielerkreationen speichern und laden

```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` speichert einen privaten Entwurf; `publish` macht ihn öffentlich. Beide brauchen den vollständigen Satz an Dateien.
- Asset-Referenzen sehen so aus: `asset:creator/name@r2`. `loadJson`, `loadText` und `downloadFile` lesen veröffentlichte Assets; `loadOwned`, `loadOwnedJson` und `loadOwnedFile` lesen die eigenen Assets des Spielers, Entwürfe eingeschlossen.
- `supports(versionRef, capability)` prüft vorab, bevor ein Asset aus einer anderen Version geöffnet wird.
- Fehler verwenden Codes wie `custom_asset_capability_unsupported` und `custom_asset_role_type_mismatch`.

Spieler müssen angemeldet sein, um zu speichern. Prüfe, was Spieler veröffentlichen, so wie du alle Inhalte von Nutzern prüfen würdest: Die Inhaltsrichtlinie von PlayDrop gilt auch dafür.

## Was der Connector annimmt

Eigene Assets und Spezifikationen, die nur aus Daten bestehen, werden wie andere Dateien hochgeladen. Ausführbare Modelle, also `MODEL_3D`-Assets mit der Unterkategorie `procedural` oder dem Format `CUSTOM`, lehnt der Connector ab, weil die API keinen Creator-Code ausführt; backe sie vorab oder verweise auf eine veröffentlichte Version. Siehe [Spiel-Assets](https://www.playdrop.ai/de/create/learn/game-assets).

## Verwandte Anleitungen

- [Spiel-Assets](https://www.playdrop.ai/de/create/learn/game-assets): Bilder, Sound, Video und 3D mit einem PlayDrop-Spiel ausliefern: gebündelte Dateien, spieleigene Assets, öffentliche Assets und Packs, Abruf mit sdk.assets.
- [catalogue.json](https://www.playdrop.ai/de/create/learn/catalogue-json): Die catalogue.json-Felder, die PlayDrop-Spiele verwenden: Identität, Texte, Spielweise, Formate, Anmeldung, Sofort, Vorladen, Medien, Übersetzungen, Punktestände und Server.
- [Client-SDK](https://www.playdrop.ai/de/create/learn/sdk): Referenz zum PlayDrop-Browser-SDK: init, Lebenszyklus, Spieler und Spielstände, Geräte, Soziales, Multiplayer, Shop, Werbung, Bestenlisten, Erfolge, Assets, KI.
