# Egna assetformat och spelarskapelser på PlayDrop

Skapa ett eget assetformat med en asset spec, deklarera formaten spelet läser eller skriver och låt spelare spara och publicera skapelser med sdk.assets.custom.

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

Med asset specs kan ett spel definiera en egen sorts asset, som en bana, en karaktär eller en kortlek, som ett kontrakt av filer. Spelare kan sedan göra, spara och publicera skapelser i det formatet, och andra spel som stöder det kan öppna dem.

## Definiera en asset spec

En asset spec deklareras i listan `assetSpecs` i catalogue.json, bredvid `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"
  }]
}
```

Kontraktet anger filerna i varje asset och hur de kontrolleras:

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

Roller kan ha ett JSON Schema, som PlayDrop kontrollerar vid varje sparning. Publicera en ny version av specen när formatet ändras; gamla assets behåller sin version.

## Deklarera vad ett spel stöder

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

Förmågorna är `READ`, `WRITE`, `EDIT`, `PREVIEW` och `IMPORT`.

## Spara och läs in spelarskapelser

```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` sparar ett privat utkast; `publish` gör det offentligt. Båda kräver den kompletta uppsättningen filer.
- Assetreferenser ser ut som `asset:creator/name@r2`. `loadJson`, `loadText` och `downloadFile` läser publicerade assets; `loadOwned`, `loadOwnedJson` och `loadOwnedFile` läser spelarens egna, inklusive utkast.
- `supports(versionRef, capability)` kontrollerar stödet innan en asset från en annan version öppnas.
- Fel använder koder som `custom_asset_capability_unsupported` och `custom_asset_role_type_mismatch`.

Spelare måste vara inloggade för att spara. Granska det som spelare publicerar på samma sätt som annat användarinnehåll: PlayDrops innehållspolicy gäller för det.

## Det här accepterar connectorn

Egna assets och specar som bara består av data laddas upp som andra filer. Körbara modeller, alltså `MODEL_3D`-assets med underkategorin `procedural` eller formatet `CUSTOM`, avvisas av connectorn eftersom API:et inte kör skaparens kod; baka dem eller referera till en publicerad version. Se [spelassets](https://www.playdrop.ai/sv/create/learn/game-assets).

## Relaterade guider

- [Spelassets](https://www.playdrop.ai/sv/create/learn/game-assets): Leverera bilder, ljud, video och 3D med ett PlayDrop-spel: medföljande filer, spelets egna assets, offentliga assets och assetpaket, och uppslag med sdk.assets.
- [catalogue.json](https://www.playdrop.ai/sv/create/learn/catalogue-json): Fälten i catalogue.json för PlayDrop-spel: identitet, spelsida, spellägen, ytor, inloggning, Instant, förladdning, media, översättningar, poäng och servrar.
- [Klient-SDK](https://www.playdrop.ai/sv/create/learn/sdk): Referens för PlayDrops webbläsar-SDK: livscykel, identitet och sparningar, handkontroller, socialt, flerspelarläge, butik, annonser, topplistor, assets och AI.
