Formatos de asset personalizados e criações dos jogadores no PlayDrop
Defina formatos de asset com especificações, declare os que um jogo lê ou grava e deixe os jogadores salvar e publicar criações com sdk.assets.custom.
As especificações de asset permitem que um jogo defina seu próprio tipo de asset, como uma fase, um personagem ou um baralho, na forma de um contrato de arquivos. Os jogadores podem então criar, salvar e publicar criações nesse formato, e outros jogos compatíveis com ele podem abri-las.
Defina uma especificação de asset
Uma especificação de asset é declarada na lista assetSpecs do catalogue.json, ao lado de apps:
{
"assetSpecs": [{
"name": "moon-level",
"version": "1.0.0",
"displayName": "Moon Jump level",
"symbol": "specs/moon-level.svg",
"contract": "specs/moon-level.contract.json"
}]
}O contrato indica os arquivos de cada asset e como verificá-los:
{
"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" }
]
}Os papéis podem trazer um JSON Schema, que o PlayDrop verifica a cada salvamento. Publique uma nova versão da especificação quando o formato mudar; os assets antigos mantêm a versão deles.
Declare o que um jogo suporta
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}As capacidades são READ, WRITE, EDIT, PREVIEW e IMPORT.
Salve e carregue as criações dos jogadores
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 um rascunho privado;publisho torna público. Os dois precisam do conjunto completo de arquivos.- As referências de asset têm o formato
asset:creator/name@r2.loadJson,loadTextedownloadFileleem assets publicados;loadOwned,loadOwnedJsoneloadOwnedFileleem os do próprio jogador, incluindo rascunhos. supports(versionRef, capability)faz a verificação antes de abrir um asset de outra versão.- Os erros usam códigos como
custom_asset_capability_unsupportedecustom_asset_role_type_mismatch.
Os jogadores precisam estar logados para salvar. Revise o que os jogadores publicam como você faria com qualquer conteúdo de usuário: a política de conteúdo do PlayDrop se aplica a ele.
O que o conector aceita
Assets e especificações personalizados só de dados são enviados como os outros arquivos. Modelos executáveis, ou seja, assets MODEL_3D com a subcategoria procedural ou com o formato CUSTOM, são recusados pelo conector porque a API não executa código do criador; converta-os em arquivos fixos (bake) ou faça referência a uma versão publicada. Veja assets de jogo.