PlayDrop’ta özel asset biçimleri ve oyuncu yapımları
Asset spesifikasyonuyla kendi biçimini tanımla, oyunun okuduğu ve yazdığı biçimleri bildir, oyuncular yapımlarını sdk.assets.custom ile kaydedip yayınlasın.
Asset spesifikasyonları, bir oyunun seviye, karakter ya da deste gibi kendi asset türünü bir dosya sözleşmesi olarak tanımlamasını sağlar. Böylece oyuncular o biçimde yapımlar oluşturabilir, kaydedebilir ve yayınlayabilir; bu biçimi destekleyen diğer oyunlar da onları açabilir.
Bir asset spesifikasyonu tanımla
Bir asset spesifikasyonu catalogue.json içindeki assetSpecs listesinde, apps alanının yanında tanımlanır:
{
"assetSpecs": [{
"name": "moon-level",
"version": "1.0.0",
"displayName": "Moon Jump level",
"symbol": "specs/moon-level.svg",
"contract": "specs/moon-level.contract.json"
}]
}Sözleşme her asset’in dosyalarını ve bunların nasıl kontrol edileceğini belirtir:
{
"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" }
]
}Roller, PlayDrop’un her kayıtta kontrol ettiği bir JSON Schema taşıyabilir. Biçim değiştiğinde yeni bir spesifikasyon sürümü yayınla; eski asset’ler kendi sürümlerini korur.
Oyunun neyi desteklediğini bildir
{
"assetSpecSupport": [
{ "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
]
}Yetenekler READ, WRITE, EDIT, PREVIEW ve IMPORT değerleridir.
Oyuncu yapımlarını kaydet ve yükle
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 }saveDraftözel bir taslak tutar;publishonu herkese açık yapar. İkisi de dosyaların eksiksiz kümesini gerektirir.- Asset referansları
asset:creator/name@r2biçimindedir.loadJson,loadTextvedownloadFileyayınlanmış asset’leri okur;loadOwned,loadOwnedJsonveloadOwnedFiletaslaklar dahil oyuncunun kendi asset’lerini okur. supports(versionRef, capability), başka bir sürümden bir asset’i açmadan önce kontrol yapar.- Hatalar
custom_asset_capability_unsupportedvecustom_asset_role_type_mismatchgibi kodlar kullanır.
Oyuncuların kaydetmek için giriş yapmış olması gerekir. Oyuncuların yayınladıklarını diğer kullanıcı içerikleri gibi gözden geçir: PlayDrop’un içerik politikası bunlar için de geçerlidir.
Bağlayıcının kabul ettikleri
Yalnızca veri içeren özel asset’ler ve spesifikasyonlar diğer dosyalar gibi yüklenir. Çalıştırılabilir modeller, yani procedural alt kategorisine veya CUSTOM biçimine sahip MODEL_3D asset’leri, API yapımcı kodunu çalıştırmadığı için bağlayıcı tarafından reddedilir; bunları sabit bir biçime dönüştür ya da yayınlanmış bir sürüme referans ver. Bkz. oyun asset’leri.