Formati di asset personalizzati e creazioni dei giocatori su PlayDrop
Definisci un tuo formato di asset, dichiara quali formati un gioco legge o scrive e fai salvare e pubblicare creazioni ai giocatori con sdk.assets.custom.
Le specifiche di asset permettono a un gioco di definire un proprio tipo di asset, come un livello, un personaggio o un mazzo, sotto forma di contratto di file. I giocatori possono poi creare, salvare e pubblicare creazioni in quel formato, e altri giochi che lo supportano possono aprirle.
Definisci una specifica di asset
Una specifica di asset si dichiara nell’elenco assetSpecs di catalogue.json, accanto ad apps:
{
"assetSpecs": [{
"name": "moon-level",
"version": "1.0.0",
"displayName": "Moon Jump level",
"symbol": "specs/moon-level.svg",
"contract": "specs/moon-level.contract.json"
}]
}Il contratto indica i file di ogni asset e come verificarli:
{
"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" }
]
}I ruoli possono includere uno schema JSON, che PlayDrop verifica a ogni salvataggio. Pubblica una nuova versione della specifica quando il formato cambia; gli asset esistenti mantengono la loro versione.
Dichiara cosa supporta un gioco
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}Le capacità sono READ, WRITE, EDIT, PREVIEW e IMPORT.
Salva e carica le creazioni dei giocatori
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 }saveDraftconserva una bozza privata;publishla rende pubblica. Entrambi richiedono l’insieme completo dei file.- I riferimenti agli asset hanno la forma
asset:creator/name@r2.loadJson,loadTextedownloadFileleggono gli asset pubblicati;loadOwned,loadOwnedJsoneloadOwnedFileleggono quelli del giocatore, bozze comprese. supports(versionRef, capability)controlla la compatibilità prima di aprire un asset di un’altra versione.- Gli errori usano codici come
custom_asset_capability_unsupportedecustom_asset_role_type_mismatch.
I giocatori devono aver effettuato l’accesso per salvare. Controlla ciò che pubblicano come faresti con qualsiasi contenuto degli utenti: si applica la politica sui contenuti di PlayDrop.
Cosa accetta il connettore
Gli asset personalizzati e le specifiche composti solo da dati si caricano come gli altri file. I modelli eseguibili, cioè gli asset MODEL_3D con la sottocategoria procedural o il formato CUSTOM, vengono rifiutati dal connettore perché l’API non esegue codice dei creator; convertili in un formato statico o fai riferimento a una versione pubblicata. Vedi asset di gioco.