Własne formaty zasobów i twórczość graczy w PlayDrop
Zdefiniuj format zasobu, zadeklaruj formaty czytane lub zapisywane przez grę i pozwól graczom zapisywać i publikować dzieła przez sdk.assets.custom.
Specyfikacje zasobów pozwalają grze zdefiniować własny rodzaj zasobu, taki jak poziom, postać czy talia, jako kontrakt plików. Gracze mogą wtedy tworzyć, zapisywać i publikować dzieła w tym formacie, a inne gry, które go obsługują, mogą je otwierać.
Zdefiniuj specyfikację zasobu
Specyfikację zasobu deklaruje się na liście assetSpecs w catalogue.json, obok apps:
{
"assetSpecs": [{
"name": "moon-level",
"version": "1.0.0",
"displayName": "Moon Jump level",
"symbol": "specs/moon-level.svg",
"contract": "specs/moon-level.contract.json"
}]
}Kontrakt wskazuje pliki każdego zasobu i sposób ich sprawdzania:
{
"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" }
]
}Role mogą zawierać schemat JSON, który PlayDrop sprawdza przy każdym zapisie. Gdy format się zmienia, opublikuj nową wersję specyfikacji; stare zasoby zachowują swoją wersję.
Zadeklaruj, co gra obsługuje
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}Możliwości to READ, WRITE, EDIT, PREVIEW i IMPORT.
Zapisuj i wczytuj twórczość graczy
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 }saveDraftzachowuje prywatny szkic;publishczyni go publicznym. Oba wymagają kompletnego zestawu plików.- Odwołania do zasobów wyglądają jak
asset:creator/name@r2.loadJson,loadTextidownloadFileodczytują opublikowane zasoby;loadOwned,loadOwnedJsoniloadOwnedFileodczytują własne zasoby gracza, łącznie ze szkicami. supports(versionRef, capability)sprawdza obsługę przed otwarciem zasobu z innej wersji.- Błędy używają kodów takich jak
custom_asset_capability_unsupportedicustom_asset_role_type_mismatch.
Gracze muszą być zalogowani, aby zapisywać. Sprawdzaj to, co publikują gracze, tak jak wszelkie treści użytkowników: obowiązuje je polityka treści PlayDrop.
Co przyjmuje konektor
Własne zasoby i specyfikacje zawierające tylko dane przesyła się jak inne pliki. Modele wykonywalne, czyli zasoby MODEL_3D z podkategorią procedural lub w formacie CUSTOM, konektor odrzuca, ponieważ API nie uruchamia kodu twórców; wypal je albo odwołaj się do opublikowanej wersji. Zobacz zasoby gry.