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

# بيانات اللاعب

> احفظ مستندات مخصّصة لكل لاعب — التقدّم والإعدادات والحالة.

export const Scope = ({children}) => <Info>
    <b>النطاق:</b> {children}
  </Info>;

تتيح لك **بيانات اللاعب** حفظ أي JSON تريده لكل لاعب: المستوى، والعملات، والمحتوى المفتوح،
والتفضيلات — أي شيء تحتاجه لعبتك. ونطاق هذه المستندات محصور باللاعب المسجَّل دخوله.

<Scope>بيانات اللاعب تخصّ كل لاعب على حدة؛ أما **قالبها** فيُعرَّف لكل **إصدار لعبة**.</Scope>

للإعداد المعتاد جانبان: **عرِّف الشكل في لوحة التحكم**، ثم **اقرأه واكتبه من حزمة التطوير**.

<Tabs>
  <Tab title="لوحة التحكم">
    يُعرِّف **قالب بيانات اللاعب** بنية نوع معيّن من المستندات وقيمه الافتراضية، فتبقى السجلات
    متّسقة بين اللاعبين والإصدارات. عرِّف القوالب في لوحة التحكم، ويرثها اللاعبون تلقائيًا.

    <Frame caption="عرِّف قوالب بيانات اللاعب من لوحة التحكم.">
      <img src="https://mintcdn.com/qwacks/TGGmq_oWzDacAqHl/images/guides/player-data.png?fit=max&auto=format&n=TGGmq_oWzDacAqHl&q=85&s=930ff5bce6ffab00c232f194a89304d0" alt="قوالب بيانات اللاعب" width="1440" height="866" data-path="images/guides/player-data.png" />
    </Frame>
  </Tab>

  <Tab title="Unity">
    شغِّل **Code Generation → Sync Schemas** في نافذة Flock لتحويل كل قالب إلى صنف C# مُحدَّد
    الأنواع، ثم اقرأ مستند اللاعب المسجَّل دخوله واكتبه مباشرةً:

    ```csharp theme={null}
    // Read (paginates and caches the player's documents on first call)
    var progress = await FlockClient.Instance.Player.GetPlayerProgressAsync();

    // Mutate the typed object and save it back
    progress.Level = 2;
    progress.Coins += 100;
    await progress.UpdateAsync();
    ```

    وتأتي أسماء الدوال والحقول من قالبك — فالقالب `PlayerProgress` يُنتج `GetPlayerProgressAsync`.
  </Tab>

  <Tab title="Unreal">
    اقرأ صفوف اللاعب باستخدام عقد *Flock | Player*، أو مزوّد اللاعب في C++. ولن تمرّر معرّف لاعب
    أبدًا — فالاستدعاءات تعمل نيابةً عن اللاعب المسجَّل دخوله.

    ```cpp theme={null}
    Sdk->GetPlayerProvider()->GetMyDataByTag(TEXT("currency"),
        [](TFlockResult<FFlockPlayerData> Result)
        {
            int32 Coins = 0;
            Result.Value.Data.TryGetInt(TEXT("coins"), Coins);
        });
    ```

    وبعد مزامنة المخطّط يختصر هذا إلى **عقدة واحدة** تُعيد بنية مُحدَّدة الأنواع بمنافذ حقيقية،
    وتصبح الكتابة عقدة ثانية — راجع [العمل مع بيانات لعبتك](/ar/sdk/unreal#work-with-your-game-data).

    <Frame caption="اجلب صف اللاعب وعدّله واحفظه — بلا نصوص حرفية ولا معرّفات تكتبها بيدك.">
      <img src="https://mintcdn.com/qwacks/xJEjgQCFVIWLhvHB/images/sdk/unreal/codegen-get-save.png?fit=max&auto=format&n=xJEjgQCFVIWLhvHB&q=85&s=ea937a651f7ff7582c7c5110de5a1322" alt="عقدة Get Player Level تُغذّي Set members ثم Save Player Level" width="752" height="352" data-path="images/sdk/unreal/codegen-get-save.png" />
    </Frame>

    وعمليات الكتابة تُصفّ في طابور عند انقطاع الاتصال وتُعاد تلقائيًا عند عودته.
  </Tab>
</Tabs>

<Tip>
  أبقِ المستندات صغيرة ومحدّدة الغرض (مستند `progression` وآخر `settings` مثلًا) بدل مستند ضخم
  واحد — فذلك يجعل التحديثات الجزئية وتتبّع الأخطاء أسهل بكثير.
</Tip>
