Eigen assetformaten en creaties van spelers op PlayDrop
Definieer een eigen assetformaat met een assetspec, geef aan wat een game leest of schrijft en laat spelers creaties opslaan en publiceren met sdk.assets.custom.
Met assetspecs kan een game een eigen soort asset definiëren, zoals een level, een personage of een kaartspel, als een contract van bestanden. Spelers kunnen dan creaties in dat formaat maken, opslaan en publiceren, en andere games die het ondersteunen kunnen ze openen.
Een assetspec definiëren
Een assetspec wordt gedeclareerd in de lijst assetSpecs van catalogue.json, naast apps:
{
"assetSpecs": [{
"name": "moon-level",
"version": "1.0.0",
"displayName": "Moon Jump level",
"symbol": "specs/moon-level.svg",
"contract": "specs/moon-level.contract.json"
}]
}Het contract noemt de bestanden van elke asset en hoe ze worden gecontroleerd:
{
"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" }
]
}Rollen kunnen een JSON Schema bevatten, dat PlayDrop bij elke save controleert. Publiceer een nieuwe versie van de spec als het formaat verandert; oude assets behouden hun versie.
Aangeven wat een game ondersteunt
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}De mogelijkheden zijn READ, WRITE, EDIT, PREVIEW en IMPORT.
Creaties van spelers opslaan en laden
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 }saveDraftbewaart een privéconcept;publishmaakt het openbaar. Beide hebben de volledige set bestanden nodig.- Assetverwijzingen zien eruit als
asset:creator/name@r2.loadJson,loadTextendownloadFilelezen gepubliceerde assets;loadOwned,loadOwnedJsonenloadOwnedFilelezen die van de speler zelf, concepten inbegrepen. supports(versionRef, capability)controleert dit voordat je een asset uit een andere versie opent.- Fouten gebruiken codes zoals
custom_asset_capability_unsupportedencustom_asset_role_type_mismatch.
Spelers moeten ingelogd zijn om op te slaan. Controleer wat spelers publiceren zoals je elke gebruikersinhoud zou controleren: het inhoudsbeleid van PlayDrop is erop van toepassing.
Wat de connector accepteert
Eigen assets en specs die alleen uit gegevens bestaan, upload je zoals andere bestanden. Uitvoerbare modellen, dus MODEL_3D-assets met de subcategorie procedural of het formaat CUSTOM, worden door de connector geweigerd omdat de API geen code van makers uitvoert; bak ze of verwijs naar een gepubliceerde versie. Zie game-assets.