Formats de ressources personnalisés et créations des joueurs
Définissez votre format de ressource, déclarez les formats qu’un jeu lit ou écrit, et laissez les joueurs enregistrer et publier leurs créations avec sdk.assets.custom.
Les spécifications de ressources permettent à un jeu de définir son propre type de ressource, comme un niveau, un personnage ou un deck, sous la forme d’un contrat de fichiers. Les joueurs peuvent alors créer, enregistrer et publier des créations dans ce format, et d’autres jeux qui le prennent en charge peuvent les ouvrir.
Définissez une spécification de ressource
Une spécification de ressource se déclare dans la liste assetSpecs de catalogue.json, à côté 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"
}]
}Le contrat nomme les fichiers de chaque ressource et indique comment les vérifier :
{
"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" }
]
}Les rôles peuvent comporter un schéma JSON, que PlayDrop vérifie à chaque enregistrement. Publiez une nouvelle version de la spécification quand le format change ; les anciennes ressources conservent leur version.
Déclarez ce qu’un jeu prend en charge
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}Les capacités possibles sont READ, WRITE, EDIT, PREVIEW et IMPORT.
Enregistrez et chargez les créations des joueurs
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 }saveDraftconserve un brouillon privé ;publishle rend public. Les deux exigent l’ensemble complet des fichiers.- Les références de ressources ressemblent à
asset:creator/name@r2.loadJson,loadTextetdownloadFilelisent les ressources publiées ;loadOwned,loadOwnedJsonetloadOwnedFilelisent celles du joueur, brouillons compris. supports(versionRef, capability)vérifie la compatibilité avant d’ouvrir une ressource d’une autre version.- Les erreurs utilisent des codes comme
custom_asset_capability_unsupportedetcustom_asset_role_type_mismatch.
Les joueurs doivent être connectés pour enregistrer. Vérifiez ce que publient les joueurs comme n’importe quel contenu d’utilisateur : la politique de contenu de PlayDrop s’y applique.
Ce que le connecteur accepte
Les ressources personnalisées et les spécifications composées uniquement de données s’envoient comme les autres fichiers. Les modèles exécutables, c’est-à-dire les ressources MODEL_3D de sous-catégorie procedural ou au format CUSTOM, sont refusés par le connecteur, car l’API n’exécute pas le code des créateurs ; figez-les en modèle statique ou référencez une version publiée. Consultez ressources de jeu.