أفكار وميزات للعبة

ميزتك التالية

العناصر

معدات فريدة بخصائص وقواعد كتالوج ومخزون لاعبين للمشروع المحدد.

SDK: فرع developتتطلب جلسة لاعب
Unity
رسم توضيحي لميزة العناصر
النتيجة المرئية

بعد الحفظ يحتوي الكتالوج على starter_sword. وبعد الشراء التجريبي المراجع يحتوي المخزون الحالي على instanceId الفريد.

الفيديو قادم لاحقًا

لا يوجد فيديو لهذه الخطوة بعد. الدليل وطلب MCP متاحان للاستخدام.

العناصر

جهّزوا المشروع نفسه

  1. اختر في لوحة التحكم المشروع نفسه الموجود في إعداد لعبتك.

    العناصر →
  2. أنشئوا إدخالات الاختبار هذه أو أعيدوا استخدام الموجود منها في نموذج لوحة التحكم. القيم أمثلة وليست بيانات المشروع الحالية.

    المفتاح
    starter_sword
    الاسم
    Quickstart Sword
    النوع
    equipment
    الندرة
    common
    نشط
    true
    الخصائص الأساسية
    {"damage":5}
    قواعد الخصائص
    []

    لكل عنصر هوية وخصائص مستقلة. تبقى الموارد القابلة للعد في قيم اللاعب، والزينة المرئية فقط في ملف اللاعب.

    جهّزوا coins وفق دليل قيم اللاعبين. احفظوا عرض starter-sword نشطاً: التكلفة 10 coins ومكافأة عنصر واحد starter_sword.

    قيم اللاعب →
  3. احفظوا الإدخالات وأعيدوا تحميلها وتحققوا منها قبل المثال. احتفظوا بالتعريفات الأخرى.

أضف هذه الميزة

يمكنك الاطلاع على الدليل. يتطلب التنفيذ مفتاح مشروع نشطًا. تجهيز المشروع

SDK مُثبّت وإعداد المشروع مُستورد واللاعب مسجّل الدخول.

يستخدم مثال SDK هذا فرع develop. تحقّق من وجود واجهات API المطلوبة في SDK المثبّت.

أكملوا اتصال البدء السريع باللاعب المقصود. استدعوا ReadCatalogPage(), ReadInventory() بزر أو إجراء مشهد صريح. فتح الملف وحده لا يرسل طلباً.

C#
Assets/Scripts/ItemsDemo.cs
استدعاء horizOn
1using UnityEngine;
2using PM.horizOn.Cloud.Manager;
3​
4public sealed class ItemsDemo : MonoBehaviour
5{
6 // Initialize/connect and restore the existing player in the Quickstart first.
7 public async void ReadInventory()
8 {
9 var user = UserManager.Instance.CurrentUser;
10 if (user == null || !user.IsValid()) return;
11 var result = await ItemsManager.Instance.GetInventory(user.UserId);
12 if (!result.IsSuccess) { Debug.LogWarning(result.ErrorCode); return; }
13 foreach (var item in result.Data.instances)
14 Debug.Log($"{item.instanceId}: {item.itemKey}");
15 // Keep result.Data.revision for a separately reviewed mutation.
16 }
17​
18 // Wire a separate explicit action; no automatic catalog traversal or poll.
19 public async void ReadCatalogPage()
20 {
21 var user = UserManager.Instance.CurrentUser;
22 if (user == null || !user.IsValid()) return;
23 var result = await ItemsManager.Instance.GetCatalog(user.UserId, limit: 1);
24 if (!result.IsSuccess) { Debug.LogWarning(result.ErrorCode); return; }
25 Debug.Log($"Catalog revision: {result.Data.revision}");
26 // Explicit Next keeps result.Data.revision and nextAfterKey unchanged.
27 }
28}
29// SDK ItemsExample/ItemsSampleStore persist original instanceId/body/revision before writes.
30// Keep the original Player Values operationId for purchase recovery.
31// The initial success may include item references; retained replay may return empty applied/items.
32// Read the current inventory separately. Never reconstruct earlier item references.
33// A failed refresh never authorizes a replacement purchase or a local item grant.
فتح مثال SDK الكامل ↗

استخدام العنصر المحفوظ

استوردوا المثال الرسمي وملفاته المساعدة. راجعوا العرض ثم نفذوا التسلسل أدناه باللاعب الحالي. انتظروا كل خطوة وأكدوا الشراء مرة واحدة. احتفظوا بالطلب الأصلي عند غموض الاستجابة.

ItemsExample: projectId → ReadOneCatalogPage() → ReviewOffers() → SavePurchaseAfterReview("starter-sword") → RefreshInventory()

اختبر ميزتك الجديدة.

بعد الحفظ يحتوي الكتالوج على starter_sword. وبعد الشراء التجريبي المراجع يحتوي المخزون الحالي على instanceId الفريد.

اختر في لوحة التحكم المشروع نفسه الموجود في إعداد لعبتك.

نقاط النهاية
  • GET/items
  • GET/items/catalog
  • POST/items/adjust
  • POST/items/equip
  • POST/items/discard
كل نقاط النهاية في مرجع API
اقتراحنا لخطوتك التالية

أضف رقمًا قياسيًا لكل جولة.

احفظ النتيجة بعد الجولة وأظهر المتصدر. واصل استخدام اتصالك وجلسة اللاعب.