> ## 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

> حوّل لعبتك في Unity إلى بناء اختبار لعب خاص بـProtokite، خطوة بخطوة.

‏Protokite Playtest حزمة اختيارية لـUnity تحوّل بناءً من لعبتك إلى **بناء اختبار لعب**. وما دام اختبار
اللعب قائمًا، يصبح كل تشغيل للعبة جلسةً واحدة في صفحة **Sessions** الخاصة بالاختبار، ويقرّر الاختبار ما
تجمعه تلك الجلسة. ولا تحتاج إلى أي شيفرة: ثبّتها، ووجّهها إلى اختبار اللعب لديك، وسجّل دخول لاعب، ثم
اضغط **Play**.

<Card title="احصل على الحزمة" icon="download" href="https://github.com/QwackStack/FlockUnitySdk/releases">
  يثبّتها تبويب **Playtesting** في حزمة Flock بنقرة واحدة. ويُرفق الملف
  `ProtokitePlaytest-<version>.unitypackage` أيضًا بكل إصدار من حزمة Flock لـUnity، وبالرقم ذاته.
</Card>

<h2 id="what-a-playtest-collects">
  ما الذي يجمعه اختبار اللعب
</h2>

| ميزة اختبار اللعب | ما يرسله البناء | أين يظهر |
| - | - | - |
| دائمًا | جلسة واحدة لكل تشغيل، باسم معرّف اللاعب على Steam أو معرّف الجهاز لهذا التثبيت | صفحة **Sessions** في Protokite |
| تسجيل الفيديو | تسجيل لشاشة اللعبة، يُرفع عند انتهائه | مشغّل التسجيل في الجلسة |
| التحليلات الثقيلة | نافذة أداء لكل عشر ثوانٍ من اللعب، وكل تحميل مشهد، وأحداث اختبار اللعب الخاصة بك | **Dashboards → Game Metrics** في Flock، ضمن فئة `playtest` |
| التقاط الاستثناءات | لا شيء إضافي — فحزمة Flock تبلّغ عن الاستثناءات بإعدادها الخاص، مهما شغّل اختبار اللعب | **Diagnostics → Errors** في Flock |
| نموذج ملاحظات منشور | إجابات اللاعب | بطاقة الجلسة، وصفحة **Feedback form** الخاصة بالاختبار |

وكلٌّ منها يُشغَّل أو يُطفأ من صفحة الاختبار في Protokite، فتغيير ما يجمعه اختبار اللعب لا يحتاج إلى
بناء جديد — ويُسأل اللاعب أولًا، فلا يجمع التشغيل إلا ما سمح به. راجع [اضغط Play](#step-5-press-play).
وكل ميزة مشروحة في صفحة [ما الذي يجمعه اختبار اللعب](/ar/protokite/unity-features).

<h2 id="before-you-start">
  قبل أن تبدأ
</h2>

* **حزمة Flock مُعدّة وتعمل** في المشروع: **Api Url** و**Api Key** و**Game Name** و**Game Version** في
  **Flock → Settings**، مع قيمة ظاهرة في **Resolved Version ID**. راجع صفحة
  [حزمة تطوير Unity](/ar/sdk/unity).
* **هناك اختبار لعب في Protokite.** وإنشاء واحد يُنشئ له إصدار لعبة في Flock، اسمه `pt-` يليه معرّف
  الاختبار.
* **يُسجَّل الفيديو على Windows بنواة 64 بت فقط.** وأما بقية المنصّات فتشغّل سائر أجزاء اختبار اللعب،
  وتذكر مرة واحدة في السجل أنها لا تسجّل فيديو. راجع [المنصّات](/ar/protokite/unity-features#platforms).

<h2 id="step-1-install-the-package">
  الخطوة 1: ثبّت الحزمة
</h2>

<Steps>
  <Step title="افتح تبويب Playtesting">
    من شريط قوائم Unity اختر **Flock → Settings** ثم تبويب **Playtesting**. يذكر التبويب رقم الإصدار الذي
    سيثبّته، وهو دائمًا مطابق لإصدار حزمة Flock لديك.

    <Frame caption="Flock → Settings → Playtesting قبل تثبيت الحزمة.">
      <img src="https://mintcdn.com/qwacks/ByDUWjWU5EEoXzc3/images/protokite/unity/playtesting-tab-install.png?fit=max&auto=format&n=ByDUWjWU5EEoXzc3&q=85&s=23f47b1f1d8cf3e237148c027a277a4c" alt="نافذة إعدادات Flock على تبويب Playtesting، وفيها Not installed وزر Install Protokite Playtest" width="560" height="275" data-path="images/protokite/unity/playtesting-tab-install.png" />
    </Frame>
  </Step>

  <Step title="اضغط Install Protokite Playtest">
    ينزّل الحزمة من إصدار حزمة Flock ويستوردها إلى `Assets/ProtokitePlaytest`، دون حاجة إلى Git. تصرّفها
    Unity، ثم يعرض التبويب الإصدار المثبّت مع زرّين تستعملهما في الخطوات التالية: **Open Playtest
    Settings** و**Check Playtest Setup**.

    <Frame caption="التبويب نفسه بعد تثبيت الحزمة: إصدارها، وموضعها، والأزرار التي تحتاجها في الخطوات التالية.">
      <img src="https://mintcdn.com/qwacks/ByDUWjWU5EEoXzc3/images/protokite/unity/playtesting-tab-installed.png?fit=max&auto=format&n=ByDUWjWU5EEoXzc3&q=85&s=62ae523d3652fe1f9a632e653504e1b8" alt="تبويب Playtesting يعرض الإصدار المثبّت مع أزرار Open Playtest Settings وCheck Playtest Setup وRemove" width="560" height="308" data-path="images/protokite/unity/playtesting-tab-installed.png" />
    </Frame>
  </Step>
</Steps>

<Tip>
  طريقتان أخريان، وكلتاهما **بإصدار حزمة Flock نفسه**: انقر نقرًا مزدوجًا على
  `ProtokitePlaytest-<version>.unitypackage` من صفحة الإصدارات، أو أدخل في **Window → Package Manager → + →
  Add package from git URL** العنوان
  `https://github.com/QwackStack/FlockUnitySDK.git?path=/ProtokitePlaytest~#v<version>` (وهذه الطريقة تحتاج
  إلى Git مثبّتًا). واترك الحزمة خارج المشاريع التي لا تُجري اختبارات لعب.
</Tip>

<h2 id="step-2-point-the-build-at-the-playtest">
  الخطوة 2: وجّه البناء إلى اختبار اللعب
</h2>

يجد Protokite اختبار اللعب من إصدار اللعبة في Flock الذي يرسله البناء.

<Steps>
  <Step title="اقرأ إصدار اختبار اللعب">
    افتح الاختبار في Protokite. تعرض كتلة **SDK** فيه **معرّف** إصدار الاختبار في Flock. أما **اسم**
    الإصدار فهو `pt-` يليه معرّف الاختبار.
  </Step>

  <Step title="اجعل Game Version اسمَ ذلك الإصدار">
    في **Flock → Settings → Configuration**، اجعل **Game Version** مساويًا لـ`pt-` يليه معرّف الاختبار، مثل
    `pt-01JABCDEFGHJKMNPQRSTVWXYZ0`. تحوّل حزمة Flock الاسم إلى معرّفه، فيظهر في **Resolved Version ID**
    المعرّفُ الذي عرضه لك Protokite.

    <Frame caption="Flock → Settings → Configuration: قيمة Game Version هي اسم اختبار اللعب، ومعها المعرّف الذي حُوِّل إليه.">
      <img src="https://mintcdn.com/qwacks/ByDUWjWU5EEoXzc3/images/protokite/unity/flock-game-version.png?fit=max&auto=format&n=ByDUWjWU5EEoXzc3&q=85&s=f841d08e25bfb5093937b3c3755a4c50" alt="تبويب Configuration في إعدادات Flock، وفيه Game Version باسم يبدأ بـpt- وقيمة في Resolved Version ID" width="560" height="218" data-path="images/protokite/unity/flock-game-version.png" />
    </Frame>
  </Step>

  <Step title="شغّل اختبار اللعب">
    اختر **Protokite → Playtest → Settings**، أو اضغط **Open Playtest Settings** في تبويب Playtesting. في
    المرة الأولى يُنشأ الملف `Assets/Resources/ProtokitePlaytestSettings.asset` واختبار اللعب مطفأ، ويُحدَّد
    في نافذة Inspector. فعّل **Playtesting Enabled**.

    قيمة **Protokite Api Url** مضبوطة مسبقًا على بيئة الإنتاج، `https://api-protokite.qwacks.com`؛ لا تغيّرها
    إلا لتشير إلى Protokite محلي مثل `http://localhost:8020`. يجب أن يبدأ العنوان بـ`http://` أو `https://`
    وألا يحوي مسافات؛ والعنوان المخالف يُرفض بدل أن يُصحَّح.

    <Frame caption="Protokite → Playtest → Settings: المفتاح، وعنوان Protokite، والسؤال الموجّه إلى اللاعب، ونموذج الملاحظات، وإعدادات التسجيل.">
      <img src="https://mintcdn.com/qwacks/ByDUWjWU5EEoXzc3/images/protokite/unity/playtest-settings.png?fit=max&auto=format&n=ByDUWjWU5EEoXzc3&q=85&s=b49ca625524fbc00b6e0d16f38e4e390" alt="ملف إعدادات Protokite Playtest في نافذة Inspector في Unity، مع تفعيل Playtesting Enabled" width="720" height="550" data-path="images/protokite/unity/playtest-settings.png" />
    </Frame>
  </Step>
</Steps>

<Warning>
  اكتب **اسم** الإصدار، لا المعرّف الذي يعرضه Protokite. فحزمة Flock تحوّل Game Version بالاسم، والمعرّف
  المكتوب في Game Version لا يتحوّل إلى شيء، فيظل البناء يرسل المعرّف الذي حُوِّل قبله. ونافذة الإعداد في
  الخطوة التالية تكتشف المعرّف الملصوق وتعرض أن تكتب الاسم الصحيح عنك.
</Warning>

<h2 id="step-3-check-your-setup">
  الخطوة 3: افحص إعدادك
</h2>

اختر **Protokite → Playtest → Setup Checks And Test Video**، أو اضغط **Check Playtest Setup** في تبويب
Playtesting. تفحص النافذة ما يحتاجه بناء هذا المشروع لاختبار اللعب. والفحص الناجح عليه علامة صح خضراء ويقول
ذلك:

| ما تقوله النافذة | حين |
| - | - |
| Playtesting is turned on | توجد إعدادات اختبار اللعب و**Playtesting Enabled** مفعّل |
| Protokite API URL is usable | يكون العنوان عنوان `http` أو `https` له مضيف ولا مسافات فيه |
| Game Version is a playtest's version | تكون قيمة **Game Version** في Flock اسمَ اختبار لعب، `pt-<test id>`، محوَّلًا إلى المعرّف الذي يرسله البناء |
| Players built for this platform record video | تكون منصّة البناء Windows بنواة 64 بت (x64) |

<Frame caption="Protokite → Playtest → Setup Checks And Test Video. ثلاثة فحوص ناجحة؛ والرابع يفشل لأن هذا المشروع يُبنى لـAndroid، ويعرض Open Build Settings.">
  <img src="https://mintcdn.com/qwacks/ByDUWjWU5EEoXzc3/images/protokite/unity/setup-checks.png?fit=max&auto=format&n=ByDUWjWU5EEoXzc3&q=85&s=f2930e900c8ed7ee25c5c2b239ea0760" alt="نافذة إعداد Protokite Playtest فيها ثلاثة فحوص ناجحة وفحص الفيديو فاشل لأن منصّة البناء Android" width="540" height="360" data-path="images/protokite/unity/setup-checks.png" />
</Frame>

الفحص الذي يفشل عليه علامة حمراء، ويذكر ما يجب تغييره، ومعه زر يفتح موضع التغيير: **Open Playtest Settings** أو
**Open Flock Settings** أو **Open Build Settings** (كما في الصورة)، أو **Set Game Version To pt-…** حين تكون قد
ألصقت معرّف الاختبار في Game Version. يُفحص Game Version مع Flock عند فتح النافذة وكلما تغيّرت إعدادات Flock؛ و**Check Again** يعيد
السؤال.

وظهور «Players built for … record no video» لا يوقف اختبار اللعب: البناء لمنصّة أخرى يشغّل كل شيء آخر ولا
يسجّل فيديو.

<h2 id="step-4-sign-a-player-in">
  الخطوة 4: سجّل دخول لاعب
</h2>

**اختبار اللعب لا يسجّل دخول أي لاعب أبدًا.** تبدأ جلسته حين تصل جلسة Flock إلى الخادم، وتبدأ جلسة Flock
حين تسجّل لعبتك دخول لاعب، مع تفعيل **Analytics Enabled** و**Analytics Auto Start Session** في **Flock →
Settings → Advanced Settings** (أو حين تستدعي `StartSessionAsync`)، ومع منح الموافقة حين يكون **Analytics
Require Explicit Consent** مفعّلًا.

ويكفي تسجيل الدخول بالجهاز، ولا يحتاج إلى حساب:

```csharp theme={null}
await FlockClient.Instance.Authentication.LoginWithDeviceAsync(SystemInfo.deviceUniqueIdentifier);
```

في المرة الأولى التي يسجّل فيها جهاز دخوله، سجّله بـ`RegisterWithDeviceAsync` بدلًا من ذلك؛ وصفحة
[حزمة تطوير Unity](/ar/sdk/unity#authenticate-a-player) تشرح تسجيل الدخول كاملًا. وفي مثال الحزمة زر **Sign In
With This Device** يفعل الأمرين، لبناء لا شاشة تسجيل دخول له.

<h2 id="step-5-press-play">
  الخطوة 5: اضغط Play
</h2>

**يسأل البناء لاعبه عمّا يجوز لاختبار اللعب أن يجمعه، ولا يجمع شيئًا حتى يجيب.** يُرسم السؤال فوق اللعبة
بمجرد تحميل اختبار اللعب الخاص بهذا البناء، ويعرض أربع إجابات: تسجيل الشاشة وجمع بيانات اللعب، أو الشاشة
وحدها، أو بيانات اللعب وحدها، أو **لا شيء على الإطلاق** — وهي تجعل البناء يتصرّف كما لو كان **Playtesting
Enabled** مطفأً.

<Frame caption="السؤال الذي يطرحه بناء اختبار اللعب على لاعبه، فوق اللعبة، قبل أن يجمع أي شيء.">
  <img src="https://mintcdn.com/qwacks/ByDUWjWU5EEoXzc3/images/protokite/unity/consent-question.png?fit=max&auto=format&n=ByDUWjWU5EEoXzc3&q=85&s=229e514c065a1e41aaab4638c753eb4e" alt="لعبة في Unity تعرض سؤال اختبار اللعب What this playtest may collect مع أربع إجابات" width="1440" height="810" data-path="images/protokite/unity/consent-question.png" />
</Frame>

ويُجاب بالفأرة. وما دام السؤال على الشاشة يظهر المؤشّر حرًّا، ويعود كما كانت لعبتك تضبطه بعد أن يجيب
اللاعب. ولا تكون أي إجابة محدّدة حين يظهر، فلا يضغط مفتاح Submit الخاص بلعبتك أي إجابة، وتُتجاهل النقرة في
نصف الثانية الأولى من ظهوره.

<Note>
  **إنه سؤال اختبار اللعب نفسه.** أما **Analytics Require Explicit Consent** في حزمة Flock فسؤال آخر، تطرحه
  لعبتك بكلماتها عن تحليلات لعبتك. ولا تغيّر أيٌّ من الإجابتين الأخرى، والسؤال يقول ذلك أمام اللاعب.
</Note>

تُحفظ الإجابة على جهاز اللاعب ويستعملها كل تشغيل لاحق، ويحمل كل بدء جلسة القيمتين `playtest_consent` و
`playtest_consent_asked`، فتُقرأ الجلسة التي لا تسجيل فيها على أنها للاعب طلب ألا يُسجَّل شيء، لا لبناء أخطأ.
ولكي يُطرح السؤال مجددًا في المحرّر، اضغط **Forget This Machine's Answer** في نافذة الإعداد.

ويمكن للعبتك أن تتولّى السؤال من قوائمها:

```csharp theme={null}
ProtokitePlaytest.PlaytestConsent             // the answer in force
ProtokitePlaytest.SetPlaytestConsent(ProtokitePlaytestConsentChoice.VideoOnly);   // answer it; NotAnswered asks again
ProtokitePlaytest.AskForPlaytestConsent();    // put the question on screen again
ProtokitePlaytest.IsConsentQuestionOpen       // while it is on screen
```

لا تُطفئ **Ask The Player For Playtest Consent** في إعدادات اختبار اللعب إلا حيث يُسأل لاعبوك بطريقة أخرى،
أو في تشغيل اختباري لا أحد فيه ليجيب؛ عندها يجمع البناء ما يشغّله اختبار اللعب، وتذكر كل جلسة أن اللاعب لم
يُسأل. والإجابة التي أعطاها لاعب من قبل تبقى معتبرة.

<h3 id="watch-it-run">
  تابعه وهو يعمل
</h3>

تذكر نافذة Console ما يفعله اختبار اللعب، وكل سطر يبدأ بـ`[Protokite Playtest]`:

```
[Protokite Playtest] The playtest's consent question is on screen; nothing is collected until the player answers it.
[Protokite Playtest] Playtesting is ready: playtest 01JABCDEFGHJKMNPQRSTVWXYZ0 is loaded, with features exception_capturing, heavy_analytics, video_recording and a feedback form.
[Protokite Playtest] Recording video for the playtest to …/recording-….webm.part, at 1280x720 and 15 frames a second (Vp8). It stops for good after 60 minutes of play, before the file passes 1536 MB, or when the game stops it.
[Protokite Playtest] Protokite session 01J… started for this launch, with the player's device id and Flock session 01J….
```

بعدها تظهر الجلسة في صفحة **Sessions** الخاصة باختبار اللعب. وتنتهي حين تُغلق اللعبة؛ وينتظر الإغلاق حتى 3
ثوانٍ ليستلم Protokite نهايتها. ولا ينهيها تسجيل الخروج ولا جلسة Flock جديدة ولا إعادة تشغيل حزمة Flock ولا
يعيد بدءها: التشغيل الواحد جلسة واحدة. وفي الشيفرة، تجيب `ProtokitePlaytest.Status` عن السؤال نفسه الذي
يجيب عنه السجل، وتعطي `ProtokitePlaytest.Describe(status)` كلمات السجل.

<h2 id="when-something-stops-the-playtest">
  حين يتوقّف اختبار اللعب
</h2>

تذكر نافذة Console السبب وما يجب تغييره، مرة واحدة، على شكل تحذير.

| الحالة | معناها | الحل |
| - | - | - |
| `TurnedOff` | **Playtesting Enabled** مطفأ، أو لا إعدادات لاختبار اللعب في المشروع | فعّله في **Protokite → Playtest → Settings** |
| `ProtokiteApiUrlMissing` | عنوان Protokite فارغ | اضبط **Protokite Api Url** (بيئة الإنتاج هي `https://api-protokite.qwacks.com`) |
| `ProtokiteApiUrlUnusable` | لا `http://` ولا `https://`، أو لا مضيف، أو فيه مسافة | صحّح العنوان؛ فهو لا يُشذَّب عنك أبدًا |
| `WaitingForFlock` | كل شيء مضبوط؛ ولم تبدأ حزمة Flock بعد | لا شيء — يتابع حين تبدأ حزمة Flock |
| `FetchingPlaytestConfig` | يسأل Protokite عن اختبار اللعب الخاص بهذا البناء | لا شيء |
| `PlaytestNotLinked` | لا اختبار لعب في Protokite لمعرّف Game Version الخاص بهذا البناء | اجعل **Game Version** اسمَ اختبار اللعب الذي يبدأ بـ`pt-` |
| `ProtokiteRefusedApiKey` | رفض Protokite مفتاح واجهة Flock البرمجية | تحقّق من **Api Key** في **Flock → Settings** |
| `PlaytestConfigUnavailable` | ظلّ Protokite أو الشبكة يفشلان | لا شيء — يُسأل مجددًا حين تبدأ جلسة Flock التالية |
| `PlaytestConfigForAnotherVersion` | أجاب Protokite باختبار لعب لإصدار آخر، كما يفعل وسيط يُسقط الترويسات | تحقّق ممّا يقع بين اللعبة وProtokite |
| `PlaytestNoLongerCollecting` | أُغلق اختبار اللعب | أعد فتحه في Protokite، أو وجّه Game Version إلى اختبار قائم |
| `WaitingForPlayerConsent` | اختبار اللعب محمَّل، ولم يذكر اللاعب ما يجوز له أن يجمعه | لا شيء — السؤال على الشاشة |
| `PlayerRefusedPlaytest` | طلب اللاعب ألا يُجمع شيء | لا شيء — هذه إجابته |

والرفض (`PlaytestNotLinked` و`ProtokiteRefusedApiKey` و`PlaytestConfigForAnotherVersion`) لا يُسأل عنه مجددًا
حتى تبدأ حزمة Flock من جديد أو يُعاد تشغيل اللعبة، إذ ستكون الإجابة نفسها.

<h2 id="before-you-ship">
  قبل أن تنشر لعبتك
</h2>

أطفئ **Playtesting Enabled** وأعِد **Game Version** إلى إصدار نشر قبل أن تبني إصدار النشر. ويبقى بناء النشر
يرفع أي تسجيل لم يستطع بناء اختبار لعب سابق على ذلك الجهاز إرساله، فلا يضيع تسجيل لاعب أبدًا؛ ومع إطفاء
اختبار اللعب لا يُسجَّل شيء آخر ولا يُرسَل. ولإزالة الحزمة اضغط **Remove** في تبويب Playtesting. ويبقى ملف
الإعدادات حتى تحذفه.

<h2 id="tell-your-players">
  أخبر لاعبيك
</h2>

يسجّل بناء اختبار اللعب شاشة اللاعب حين يشغّل الاختبار الفيديو، ويرسل ما يكتبه في نموذج الملاحظات. يسألهم
البناء أولًا ويفعل ما يجيبون به، لكن أخبر مختبريك قبل أن يلعبوا على أي حال: ما الذي يُسجَّل، وأنه يذهب إلى
اختبار اللعب الخاص باستوديوك في Protokite، وكيف يصلون إليك ليُحذف. وذلك السؤال يخصّ هذا الاختبار وحده — أما
ما تجمعه لعبتك بنفسها فما زال عليك أن تسأل عنه.

<CardGroup cols={2}>
  <Card title="ما الذي يجمعه اختبار اللعب" icon="video" href="/ar/protokite/unity-features">
    الفيديو، ونوافذ الأداء، والاستثناءات، ونماذج الملاحظات، واستدعاءات C# لكلٍّ منها، وكيف تختبر ذلك كله.
  </Card>

  <Card title="حزمة تطوير Unity" icon="unity" href="/ar/sdk/unity">
    حزمة Flock التي يعمل عليها اختبار اللعب: الإعداد، وتسجيل الدخول، وبيانات لعبتك.
  </Card>
</CardGroup>
