# صيغ الأصول المخصصة وإبداعات اللاعبين على PlayDrop

عرّف صيغة أصول خاصة بك بمواصفة أصول، وصرّح بالصيغ التي تقرؤها اللعبة أو تكتبها، ودع اللاعبين يحفظون إبداعاتهم وينشرونها عبر sdk.assets.custom.

Source: https://www.playdrop.ai/ar/create/learn/custom-assets

تتيح مواصفات الأصول للعبة تعريف نوع خاص بها من الأصول، مثل مرحلة أو شخصية أو رزمة بطاقات، بوصفه عقدًا من الملفات. يمكن للاعبين بعد ذلك صنع إبداعات بتلك الصيغة وحفظها ونشرها، ويمكن للألعاب الأخرى التي تدعمها فتحها.

## عرّف مواصفة أصول

تُصرَّح مواصفة الأصول في قائمة `assetSpecs` في catalogue.json، بجوار `apps`:

```json
{
  "assetSpecs": [{
    "name": "moon-level",
    "version": "1.0.0",
    "displayName": "Moon Jump level",
    "symbol": "specs/moon-level.svg",
    "contract": "specs/moon-level.contract.json"
  }]
}
```

يسمّي العقد ملفات كل أصل وطريقة التحقق منها:

```json
{
  "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" }
  ]
}
```

يمكن أن تحمل الأدوار مخطط JSON Schema، يتحقق منه PlayDrop عند كل حفظ. انشر إصدارًا جديدًا من المواصفة عندما تتغير الصيغة؛ وتحتفظ الأصول القديمة بإصدارها.

## صرّح بما تدعمه اللعبة

```json
{
  "assetSpecSupport": [
    { "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
  ]
}
```

القدرات هي `READ` و`WRITE` و`EDIT` و`PREVIEW` و`IMPORT`.

## احفظ إبداعات اللاعبين وحمّلها

```js
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` بمسودة خاصة؛ ويجعلها `publish` عامة. ويحتاج كلاهما إلى الملفات كاملة.
- تبدو مراجع الأصول هكذا: `asset:creator/name@r2`. تقرأ `loadJson` و`loadText` و`downloadFile` الأصول المنشورة؛ وتقرأ `loadOwned` و`loadOwnedJson` و`loadOwnedFile` أصول اللاعب نفسه، بما فيها المسودات.
- تتحقق `supports(versionRef, capability)` من الدعم قبل فتح أصل من إصدار آخر.
- تستخدم الأخطاء رموزًا مثل `custom_asset_capability_unsupported` و`custom_asset_role_type_mismatch`.

يجب أن يسجّل اللاعبون الدخول للحفظ. راجع ما ينشره اللاعبون كما تراجع أي محتوى من المستخدمين: تنطبق عليه سياسة المحتوى في PlayDrop.

## ما يقبله الموصّل

تُرفع الأصول المخصصة والمواصفات التي تحتوي على بيانات فقط مثل الملفات الأخرى. أما النماذج القابلة للتنفيذ، أي أصول `MODEL_3D` ذات الفئة الفرعية `procedural` أو الصيغة `CUSTOM`، فيرفضها الموصّل لأن الواجهة البرمجية لا تشغّل كود المبدعين؛ حوّلها مسبقًا إلى صيغة ثابتة أو أشر إلى إصدار منشور. راجع [أصول اللعبة](https://www.playdrop.ai/ar/create/learn/game-assets).

## أدلة ذات صلة

- [أصول اللعبة](https://www.playdrop.ai/ar/create/learn/game-assets): أضف الصور والصوت والفيديو والنماذج ثلاثية الأبعاد إلى لعبة PlayDrop: ملفات مضمّنة وأصول تملكها اللعبة وأصول وباقات عامة، والبحث عنها أثناء التشغيل عبر sdk.assets.
- [catalogue.json](https://www.playdrop.ai/ar/create/learn/catalogue-json): حقول catalogue.json في ألعاب PlayDrop: الهوية وصفحة اللعبة وطرق اللعب والواجهات وتسجيل الدخول وInstant والتحميل المسبق والوسائط والترجمات والنقاط والخوادم.
- [SDK للعميل](https://www.playdrop.ai/ar/create/learn/sdk): مرجع PlayDrop SDK للمتصفح: دورة حياة المضيف والهوية والحفظ ووحدات التحكم والتواصل واللعب الجماعي والمتجر والإعلانات ولوحات المتصدرين والأصول والذكاء الاصطناعي.
