Formatos de recursos personalizados y creaciones de jugadores
Define tu formato con una especificación de recurso, declara qué formatos lee o escribe un juego y deja que los jugadores publiquen con sdk.assets.custom.
Las especificaciones de recurso permiten que un juego defina su propio tipo de recurso, como un nivel, un personaje o una baraja, como un contrato de archivos. Así, los jugadores pueden crear, guardar y publicar creaciones en ese formato, y otros juegos compatibles pueden abrirlas.
Define una especificación de recurso
Una especificación de recurso se declara en la lista assetSpecs de catalogue.json, junto a apps:
{
"assetSpecs": [{
"name": "moon-level",
"version": "1.0.0",
"displayName": "Moon Jump level",
"symbol": "specs/moon-level.svg",
"contract": "specs/moon-level.contract.json"
}]
}El contrato indica los archivos de cada recurso y cómo comprobarlos:
{
"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" }
]
}Los roles pueden incluir un JSON Schema, que PlayDrop comprueba en cada guardado. Publica una nueva versión de la especificación cuando cambie el formato; los recursos antiguos conservan su versión.
Declara qué admite un juego
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}Las capacidades son READ, WRITE, EDIT, PREVIEW e IMPORT.
Guarda y carga creaciones de jugadores
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 }saveDraftguarda un borrador privado;publishlo hace público. Ambos necesitan el conjunto completo de archivos.- Las referencias de recurso tienen el formato
asset:creator/name@r2.loadJson,loadTextydownloadFileleen recursos publicados;loadOwned,loadOwnedJsonyloadOwnedFileleen los del propio jugador, borradores incluidos. supports(versionRef, capability)comprueba la compatibilidad antes de abrir un recurso de otra versión.- Los errores usan códigos como
custom_asset_capability_unsupportedycustom_asset_role_type_mismatch.
Los jugadores tienen que iniciar sesión para guardar. Revisa lo que publican los jugadores como harías con cualquier contenido de usuarios: se le aplica la política de contenido de PlayDrop.
Qué acepta el conector
Los recursos personalizados y las especificaciones que solo contienen datos se suben como cualquier otro archivo. El conector rechaza los modelos ejecutables, es decir, los recursos MODEL_3D con la subcategoría procedural o el formato CUSTOM, porque la API no ejecuta código de los creadores; hornéalos en un formato estático o haz referencia a una versión publicada. Consulta recursos de juego.