> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwacks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# حزمة تطوير Unity

> أضف Flock إلى لعبتك في Unity عبر حزمة التطوير الرسمية بلغة C#.

تربط حزمة تطوير Flock لـUnity لعبتك بالواجهة الخلفية لـFlock: مصادقة اللاعبين، وبيانات الحفظ،
والاقتصاد، والإعدادات عن بُعد، والأصول القابلة للتنزيل، والتحليلات — كل ذلك يُضبط من نافذة واحدة
داخل المحرّر، مع شيفرة C# مُحدَّدة الأنواع تُولَّد من مخطّطاتك أنت.

<Card title="نزّل حزمة تطوير Unity" icon="download" href="https://github.com/QwackStack/FlockUnitySdk/releases">
  احصل على أحدث ملف `.unitypackage` من صفحة الإصدارات.
</Card>

<h2 id="requirements">
  المتطلّبات
</h2>

* Unity **2020.3** أو أحدث
* `com.unity.nuget.newtonsoft-json` **3.0.2+**

<h2 id="setup">
  الإعداد
</h2>

<Steps>
  <Step title="استورد الحزمة">
    نزّل أحدث [إصدار](https://github.com/QwackStack/FlockUnitySdk/releases) واستورد ملف
    `.unitypackage` (**Assets → Import Package → Custom Package**).
  </Step>

  <Step title="أضف اعتمادية JSON">
    أضف Newtonsoft JSON إلى `Packages/manifest.json`:

    ```json theme={null}
    { "dependencies": { "com.unity.nuget.newtonsoft-json": "3.0.2" } }
    ```
  </Step>

  <Step title="اضبط الإعدادات">
    افتح **Flock → Settings** واملأ الحقول الأربعة من صفحة لعبتك على
    [لوحة التحكم](https://flock-saas.qwacks.com):

    | الحقل            | القيمة                                                                          |
    | ---------------- | ------------------------------------------------------------------------------- |
    | **API URL**      | اترك القيمة الافتراضية (`https://api-flock.qwacks.com`) ما لم يُطلب منك غير ذلك |
    | **API Key**      | يُعرّف لعبتك — تعامَل معه كما تتعامل مع كلمة المرور                             |
    | **Game ID**      | المعرّف الفريد للعبتك                                                           |
    | **Game Version** | اسم إصدار موجود على لوحة التحكم (مثل `v1.0.0`)                                  |

    <Frame caption="أدخِل بيانات اعتمادك في نافذة Flock → Settings.">
      <img src="https://mintcdn.com/qwacks/t1y6gKpT0QDY7QZQ/images/sdk/Credientials.png?fit=max&auto=format&n=t1y6gKpT0QDY7QZQ&q=85&s=fa0ca80d80f1589d16dba9d5f6d0625a" alt="بطاقة بيانات اعتماد الواجهة البرمجية في نافذة Flock" width="891" height="228" data-path="images/sdk/Credientials.png" />
    </Frame>

    وتُحفظ القيم في `Assets/Resources/FlockConfig.asset`. وأثناء إدخالك لها، تُجهّز النافذة الأمرين
    اللذين تحتاجهما الحزمة قبل أن تبدأ:

    * **Resolve Game Version** — يُبحث عن اسم إصدارك و**يُخبز معرّفه داخل الإعداد**. وتستخدم التهيئة
      عند التشغيل ذلك المعرّف المخبوز مباشرةً ولا تتصل بالخادم إطلاقًا، لذا يجب أن يُحلّ قبل أن تلعب
      أو تبني. وتحلّه النافذة تلقائيًا كلما تغيّرت بيانات اعتمادك (أو اضغط **Resolve Game Version**).
    * **Verify** — يؤكّد زر **Verify** في قائمة **Setup** أن بيانات اعتمادك تصل فعلًا إلى Flock.

    وظهور علامات خضراء عبر قائمة **Setup** يعني أنك جاهز للتهيئة.

    <Frame caption="تمّ التحقّق من الاتصال وحُلّ إصدار اللعبة — وكلاهما مطلوب قبل التهيئة.">
      <img src="https://mintcdn.com/qwacks/t1y6gKpT0QDY7QZQ/images/sdk/EditorVerifiedAndResolved.png?fit=max&auto=format&n=t1y6gKpT0QDY7QZQ&q=85&s=0850bc813480c51663a55c136bb3b813" alt="قائمة Setup تُظهر اتصالًا مُتحقَّقًا منه وإصدار لعبة مُحلًّا" width="884" height="913" data-path="images/sdk/EditorVerifiedAndResolved.png" />
    </Frame>
  </Step>
</Steps>

<Warning>
  يُشحن مفتاح الواجهة البرمجية داخل نسختك المبنية (إذ يُحمَّل من `Resources` عند التشغيل). استخدم
  مفتاحًا مخصّصًا للبيئة الصحيحة، وبدّله من لوحة التحكم إن تسرّب.
</Warning>

<h2 id="your-first-call">
  أول استدعاء لك
</h2>

مع تفعيل التهيئة التلقائية تكون الحزمة قيد التشغيل بالفعل — ما عليك إلا استخدام
`FlockClient.Instance`.

```csharp theme={null}
using Flock;

// 1. Sign a player in. Auth methods throw on failure.
await FlockClient.Instance.Authentication.LoginWithDeviceAsync("device-uuid");

// 2. Call any service through the singleton.
var game = await FlockClient.Instance.Game.GetGameAsync();
Debug.Log($"Signed in as {FlockClient.Instance.CurrentPlayerId}, playing {game.Name}");
```

<h2 id="initialization">
  التهيئة
</h2>

يمكن أن تبدأ الحزمة بثلاث طرق. **التلقائية** هي الافتراضية وتناسب معظم الألعاب؛ أما الطريقتان
الأخريان فتمنحانك، مقابل قليل من الإعداد، تحكّمًا في *وقت* التهيئة (بعد شاشة البداية، أو اتفاقية
الترخيص، وما إلى ذلك).

<Tabs>
  <Tab title="تلقائيًا (الوضع الافتراضي)">
    لا شيء عليك استدعاؤه — إذ تهيّئ الحزمة نفسها من `FlockConfig.asset` قبل تحميل أول مشهد، وتستعيد
    الجلسة المحفوظة في الخلفية. وتفاعَل مع أحداث دورة الحياة إن احتجت:

    ```csharp theme={null}
    FlockEvents.OnInitialized     += ()       => Debug.Log("Flock ready");
    FlockEvents.OnSessionRestored += signedIn => Debug.Log(signedIn ? "Resumed" : "Show login");
    ```
  </Tab>

  <Tab title="مكوّن داخل المشهد">
    عطّل **Auto-Initialize On Load**، ثم اضغط **Add to Scene** في نافذة Flock (أو أضف مكوّن
    `FlockBootstrap` بنفسك). يقرأ المكوّن ملف إعدادك ويهيّئ الحزمة في `Awake`. ضعه في مشهد إقلاع مع
    تفعيل **Don't Destroy On Load**.

    <Frame caption="مكوّن FlockBootstrap موجَّهًا إلى ملف إعداد FlockConfig لديك.">
      <img src="https://mintcdn.com/qwacks/t1y6gKpT0QDY7QZQ/images/sdk/BootStrapInScene.png?fit=max&auto=format&n=t1y6gKpT0QDY7QZQ&q=85&s=c0a794c36671b8849fb637c890be5ff8" alt="مكوّن FlockBootstrap في لوحة Inspector" width="610" height="274" data-path="images/sdk/BootStrapInScene.png" />
    </Frame>
  </Tab>

  <Tab title="يدويًا">
    عطّل **Auto-Initialize On Load** وأنشئ العميل بنفسك — بعد شاشة البداية أو اتفاقية الترخيص مثلًا.
    و`Create` متزامن ولا يُجري أي اتصال بالشبكة.

    ```csharp theme={null}
    var config = Resources.Load<FlockConfigAsset>("FlockConfig");
    FlockClient.Create(config.ToInitConfig());

    // Manual init does NOT resume a saved session — do it yourself if you persist sessions:
    bool signedIn = await FlockClient.Instance.Authentication.TryRestoreSessionAsync();
    ```
  </Tab>
</Tabs>

<Note>
  التهيئة تفشل سريعًا. فالإعداد الخاطئ يرمي استثناءً (ومسار التهيئة التلقائية يسجّل الخطأ بدل أن
  ينهار)، ويرمي `FlockClient.Instance` استثناءً حتى تنجح التهيئة. احتَط بـ`FlockClient.IsInitialized`،
  أو افحص `FlockClient.InitializationError`، أو تعامَل مع `FlockEvents.OnInitializationFailed`.
</Note>

<h2 id="authenticate-a-player">
  صادِق لاعبًا
</h2>

تسجيل الدخول لا يُنشئ حسابًا — فالتسجيل استدعاء منفصل من نوع `RegisterWith…Async`. وتسجيل هوية لها
حساب بالفعل ينجح بدل أن يفشل، فيمكنك توجيه اللاعب إلى تسجيل الدخول. ودوال المصادقة **ترمي استثناءً**
عند الإخفاق، لذا غلّفها بـ`try/catch`.

<Tabs>
  <Tab title="الجهاز">
    ```csharp theme={null}
    await FlockClient.Instance.Authentication.LoginWithDeviceAsync("device-uuid");
    ```
  </Tab>

  <Tab title="البريد الإلكتروني">
    ```csharp theme={null}
    await FlockClient.Instance.Authentication.LoginWithEmailAsync(email, password);
    ```
  </Tab>

  <Tab title="Google / Apple / Steam / Facebook / Discord">
    مرّر الرمز أو التذكرة الصادرة عن المنصة إلى دالة `LoginWith…Async` المقابلة.
  </Tab>
</Tabs>

وتتجدّد الجلسات تلقائيًا. اشترك في `FlockEvents.OnAuthenticated` و`OnAuthExpired` لتقود بهما واجهتك.

<h2 id="work-with-your-game-data">
  اعمل مع بيانات لعبتك
</h2>

شغّل **Code Generation → Sync Schemas** في نافذة Flock لتحويل قوالب اللاعبين والإعدادات والمتاجر
الموجودة في لوحة التحكم إلى وسائط وصول C# مُحدَّدة الأنواع داخل `Assets/Flock/Generated/`.

<Frame caption="تبويب Code Generation — شغّل Sync Schemas، ثم تصفّح فهرس المحتوى المُولَّد.">
  <img src="https://mintcdn.com/qwacks/t1y6gKpT0QDY7QZQ/images/sdk/CodeGen.png?fit=max&auto=format&n=t1y6gKpT0QDY7QZQ&q=85&s=08764cfffc84abc39681151d9661e89e" alt="تبويب Code Generation في نافذة Flock" width="888" height="765" data-path="images/sdk/CodeGen.png" />
</Frame>

```csharp theme={null}
// Player data — typed accessor generated from your "PlayerProgress" template.
var progress = await FlockClient.Instance.Player.GetPlayerProgressAsync();
progress.Level = 5;
await progress.UpdateAsync();

// Remote config — change values on the dashboard without rebuilding.
var gameplay = await FlockClient.Instance.Config.GetGameplayAsync();
float speed = gameplay.BaseMoveSpeed;

// Shop — enum-keyed purchase; the SDK resolves ids for you.
await FlockClient.Instance.Shop.PurchaseAsync(FlockShopItemId.GemPack);
```

<Tip>
  تكتب كل مزامنة أيضًا ملف **FlockContentCatalog** للقراءة فقط — فيستطيع المصمّمون تصفّح كل متجر
  وإعداد وقالب من لوحة Inspector دون لمس الشيفرة أو لوحة التحكم.
</Tip>

<Frame caption="ملف FlockContentCatalog المُولَّد — المتاجر والإعدادات والقوالب بقيمها.">
  <img src="https://mintcdn.com/qwacks/t1y6gKpT0QDY7QZQ/images/sdk/FlockContentCatalog.png?fit=max&auto=format&n=t1y6gKpT0QDY7QZQ&q=85&s=119dd7bfad27afa9eb59c5855437a2c7" alt="ملف FlockContentCatalog مفتوحًا في لوحة Inspector" width="912" height="1021" data-path="images/sdk/FlockContentCatalog.png" />
</Frame>

<h2 id="explore-features">
  استكشف الميزات
</h2>

<CardGroup cols={2}>
  <Card title="اللاعبون والمصادقة" icon="user" href="/ar/guides/players-and-auth" />

  <Card title="ربط الحسابات" icon="link" href="/ar/guides/account-linking" />

  <Card title="بيانات اللاعب" icon="database" href="/ar/guides/player-data" />

  <Card title="المتاجر والمخزون" icon="cart-shopping" href="/ar/guides/shops-and-inventory" />

  <Card title="لوحات الصدارة" icon="ranking-star" href="/ar/guides/leaderboards" />

  <Card title="الإشعارات" icon="bell" href="/ar/guides/notifications" />

  <Card title="الإعدادات عن بُعد" icon="sliders" href="/ar/guides/remote-config" />

  <Card title="الأصول" icon="box-archive" href="/ar/guides/assets" />

  <Card title="التحليلات والأحداث" icon="chart-line" href="/ar/guides/analytics-and-events" />
</CardGroup>

<h2 id="advanced-settings">
  الإعدادات المتقدّمة
</h2>

يضبط تبويب **Advanced Settings** التحليلات، وإعادات محاولة HTTP، وذاكرتَي الأصول ووضع عدم الاتصال،
وأدوات المحرّر (بما فيها **Auto-Initialize On Load**). والقيم الافتراضية معقولة — فلا تغيّرها إلا
عند الحاجة.

<Frame caption="Advanced Settings — التحليلات، وإعادات المحاولة، والتخزين المؤقّت، وأدوات المحرّر.">
  <img src="https://mintcdn.com/qwacks/t1y6gKpT0QDY7QZQ/images/sdk/AdvancedSettings.png?fit=max&auto=format&n=t1y6gKpT0QDY7QZQ&q=85&s=bc2ffa067b08327bfb87ef3fcdb2f204" alt="تبويب Advanced Settings في نافذة Flock" width="886" height="1066" data-path="images/sdk/AdvancedSettings.png" />
</Frame>

<h2 id="error-handling">
  معالجة الأخطاء
</h2>

يرفع كل إخفاق في الحزمة استثناء `FlockException` يحمل رسالة `Message` مقروءة، ورمز `Code` لأخطاء
الواجهة الخلفية المُرمَّزة، و`StatusCode` حيثما ينطبق.

```csharp theme={null}
try
{
    await FlockClient.Instance.Authentication.LoginWithEmailAsync(email, password);
}
catch (FlockException ex)
{
    Debug.LogError($"Sign-in failed: {ex.Message}");
}
```

<Tip>
  تجد المرجع الكامل للواجهة البرمجية، وتفاصيل توليد الشيفرة، وذاكرة وضع عدم الاتصال، وضبط
  التحليلات في [ملف README الخاص بالحزمة](https://github.com/QwackStack/FlockUnitySdk#readme).
</Tip>
