قم بضبط لعبة Unity الخاصة بك باستخدام Firebase Remote Config

1 المقدمة

يمكنك استخدام Firebase Remote Config لتحديد أزواج القيمة الرئيسية ، والمعروفة أيضًا باسم المعلمات، في تطبيقك وتحديث قيمها في السحابة، مما يسمح لك بتعديل مظهر تطبيقك وسلوكه دون توزيع تحديث التطبيق.

ستضيف هذه الوظيفة الجديدة إلى نموذج لعبة MechaHamster: Level Up with Firebase Edition . نموذج اللعبة هذا هو إصدار جديد من لعبة Firebase الكلاسيكية MechaHamster التي تزيل معظم وظائف Firebase المضمنة بها، مما يتيح لك الفرصة لتنفيذ استخدامات جديدة لـ Firebase في مكانها.

للتأكد من أن تطبيقك يعمل على النحو المنشود، ستقوم بتعيين التكوينات الافتراضية للقيم في نموذج التعليمات البرمجية للعبة، ويمكن تجاوز هذه القيم بواسطة القيم التي قمت بتعيينها في Remote Config في وحدة تحكم Firebase .

ما ستتعلمه

  • كيفية تعيين قيم التكوين عن بعد في السحابة واسترجاعها
  • كيفية استخدام رمز Unity C# الخاص بك لاستخدام القيم المستردة تلقائيًا
  • كيفية تخزين القيم/الكائنات المركبة وأدواتها وتجاوزها كقيم JSON
  • كيفية استخدام شروط التكوين عن بعد لخدمة متغيرات القيمة المختلفة لمجموعات مختلفة من المستخدمين

ماذا ستحتاج

  • Unity 2019.1.0f1 أو إصدار أحدث مع دعم إصدار iOS و/أو Android
  • جهاز Android/iOS فعلي أو جهاز محاكاة/محاكي لإنشاء اللعبة وتشغيلها

2. قم بإعداد بيئة التطوير الخاصة بك

تصف الأقسام التالية كيفية تنزيل كود Level Up with Firebase ، وفتحه في Unity، وإضافة مشروع Firebase. يتم استخدام نموذج لعبة Level Up with Firebase هذا بواسطة العديد من مختبرات التعليمات البرمجية الأخرى الخاصة بـ Firebase + Unity، لذا ربما تكون قد أكملت المهام الواردة في هذا القسم بالفعل. إذا كان الأمر كذلك، فيمكنك تخطي هذه الخطوات والمتابعة إلى إضافة Firebase SDKs for Unity لإضافة Remote Config إلى نموذج التعليمات البرمجية للعبة.

قم بتنزيل الكود

قم باستنساخ مستودع GitHub الخاص ببرنامج Codelab من سطر الأوامر:

git clone https://github.com/firebase/level-up-with-firebase

وبدلاً من ذلك، إذا لم يكن git مثبتًا لديك، فيمكنك تنزيل المستودع كملف ZIP .

افتح Level Up with Firebase في محرر Unity

  1. قم بتشغيل Unity Hub، ومن علامة التبويب "المشاريع "، انقر فوق السهم المنسدل بجوار " فتح" .
  2. انقر فوق إضافة مشروع من القرص .
  3. انتقل إلى الدليل الذي يحتوي على الرمز، ثم انقر فوق موافق .
  4. إذا طُلب منك، حدد إصدار محرر Unity الذي تريد استخدامه والنظام الأساسي المستهدف (Android أو iOS).
  5. انقر فوق اسم المشروع، Level-up-with-firebase ، وسيتم فتح المشروع في محرر Unity.
  6. إذا لم يفتحه المحرر تلقائيًا، فافتح MainGameScene في Assets > Hamster في علامة تبويب Project في Unity Editor.

لمزيد من المعلومات حول تثبيت Unity واستخدامه، راجع العمل في Unity .

3. أضف Firebase إلى مشروع Unity الخاص بك

إنشاء مشروع Firebase

  1. في وحدة تحكم Firebase ، انقر فوق إضافة مشروع .
  2. لإنشاء مشروع جديد، أدخل اسم المشروع المطلوب.
    سيؤدي هذا أيضًا إلى تعيين معرف المشروع (المعروض أسفل اسم المشروع) على شيء يعتمد على اسم المشروع. يمكنك اختياريًا النقر فوق أيقونة التحرير الموجودة على معرف المشروع لتخصيصه بشكل أكبر.
  3. إذا طُلب منك، راجع شروط Firebase واقبلها.
  4. انقر فوق "متابعة" .
  5. حدد خيار تمكين Google Analytics لهذا المشروع ، ثم انقر فوق متابعة .
  6. حدد حساب Google Analytics موجودًا لاستخدامه أو حدد إنشاء حساب جديد لإنشاء حساب جديد.
  7. انقر فوق إنشاء مشروع .
  8. عندما يتم إنشاء المشروع، انقر فوق "متابعة" .

سجل تطبيقك مع Firebase

  1. افتح وحدة تحكم Firebase ، ومن وسط صفحة النظرة العامة على المشروع، انقر فوق أيقونة Unity لبدء سير عمل الإعداد، أو إذا كنت قد أضفت بالفعل تطبيقًا إلى مشروع Firebase الخاص بك، فانقر فوق إضافة تطبيق لعرض خيارات النظام الأساسي.
  2. حدد لتسجيل أهداف إنشاء كل من Apple (iOS) وAndroid.
  3. أدخل المعرف (المعرفات) الخاص بالنظام الأساسي لمشروع Unity الخاص بك. بالنسبة لهذا الدرس التطبيقي حول التعليمات البرمجية، أدخل ما يلي:
  4. اختياريًا، أدخل اللقب (الأسماء المستعارة) الخاص بالمنصة الخاصة بمشروع Unity الخاص بك.
  5. انقر فوق تسجيل التطبيق وانتقل إلى قسم تنزيل ملف التكوين .
  6. كرر العملية لأي هدف بناء لم تقم به في المرة الأولى.

إضافة ملفات تكوين Firebase

بعد النقر فوق تسجيل التطبيق ، سيُطلب منك تنزيل ملفي تكوين (ملف تكوين واحد لكل هدف بناء). يحتاج مشروع Unity الخاص بك إلى بيانات تعريف Firebase الموجودة في هذه الملفات للاتصال بـ Firebase.

  1. قم بتنزيل كلا ملفي التكوين المتاحين:
    • بالنسبة لنظام Apple (iOS) : قم بتنزيل GoogleService-Info.plist .
    • لنظام Android : قم بتنزيل google-services.json .
  2. افتح نافذة المشروع في مشروع Unity الخاص بك، ثم انقل ملفي التكوين إلى مجلد الأصول .
  3. مرة أخرى في وحدة تحكم Firebase، في سير عمل الإعداد، انقر فوق "التالي" وتابع إلى إضافة Firebase SDKs for Unity.

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

أضف حزم Firebase SDK للوحدة

  1. انقر فوق تنزيل Firebase Unity SDK في وحدة تحكم Firebase.
  2. قم بفك ضغط SDK في مكان مناسب.
  3. في مشروع Unity المفتوح لديك، انتقل إلى Assets > Import Package > Custom Package .
  4. في مربع حوار استيراد الحزمة ، انتقل إلى الدليل الذي يحتوي على حزمة SDK التي تم فك ضغطها، وحدد FirebaseAnalytics.unitypackage ، ثم انقر فوق فتح .
  5. من مربع الحوار "استيراد حزمة الوحدة" الذي يظهر، انقر فوق "استيراد" .
  6. كرر الخطوات السابقة لاستيراد الحزمتين التاليتين:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics هو برنامج خفيف الوزن لمراسل الأعطال في الوقت الفعلي يساعدك على تتبع مشكلات الاستقرار التي تؤدي إلى تآكل جودة تطبيقك وتحديد أولوياتها وإصلاحها. إذا لم تكن قد استخدمته من قبل، ففكر في إكمال مسار التعلم Crashlytics لـ Unity .
  7. ارجع إلى وحدة تحكم Firebase، وفي سير عمل الإعداد، انقر فوق التالي .

لمزيد من المعلومات حول إضافة Firebase SDK إلى مشاريع Unity، راجع خيارات تثبيت Unity الإضافية .

4. قم بتعيين الإعدادات الافتراضية للتكوين عن بعد وجلب قيم جديدة

في هذا الدرس التطبيقي حول التعليمات البرمجية، ستقوم بتحديث الكائنات التي تستخدم القيم المحددة في التعليمات البرمجية أو التي يتم تسلسلها في محرر Unity لاستخدام القيم المجهزة باستخدام Remote Config. ستقوم بتكوين القيم الافتراضية لكل معلمة باستخدام SetDefaultsAsync حتى يتصرف تطبيقك على النحو المنشود قبل أن يتصل بالواجهة الخلفية للتكوين عن بعد. سيظل تطبيقك محدثًا من خلال جلب قيم جديدة من Remote Config وتنشيطها لجعلها قابلة للاستخدام في التعليمات البرمجية.

لجلب قيم جديدة من Remote Config، هناك عدد من الطرق غير المنفذة الموجودة بالفعل في ملف Assets/Hamster/Scripts/MainGame.cs والتي يجب إكمالها.

  1. أضف عبارات using التالية إلى MainGame.cs :
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    تحتوي وحدة Firebase.Extensions على بعض الامتدادات لواجهة برمجة تطبيقات مهام C# والتي ستساعد في جعل إدارة عملية التهيئة باستخدام عمليات الاسترجاعات أكثر بساطة.
  2. قم بإضافة تهيئة Firebase إلى أسلوب MainGame.cs Start() الخاص بك عن طريق استبدال الأسلوبInitializeCommonDataAndStartGame() الموجود بالطريقة غير المنفذة حاليًا، InitializeFirebaseAndStartGame() :
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. في MainGame.cs ، ابحث عن InitializeFirebaseAndStartGame() . قم بتعريف متغير التطبيق والكتابة فوق تنفيذ الطريقة كما يلي:
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
       Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
       .ContinueWithOnMainThread(
          previousTask =>
          {
             var dependencyStatus = previousTask.Result;
             if (dependencyStatus == Firebase.DependencyStatus.Available) {
             // Create and hold a reference to your FirebaseApp,
             app = Firebase.FirebaseApp.DefaultInstance;
             // Set the recommended Crashlytics uncaught exception behavior.
             Crashlytics.ReportUncaughtExceptionsAsFatal = true;
             SetRemoteConfigDefaults();
             } else {
             UnityEngine.Debug.LogError(
                $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
                "Firebase Unity SDK is not safe to use here");
             }
          });
    }
    
  4. تستدعي تهيئة Firebase SetRemoteConfigDefaults عند النجاح لتعيين القيم الافتراضية داخل التطبيق. استبدل أسلوب SetRemoteConfigDefaults غير المنفذ بما يلي:
    private void SetRemoteConfigDefaults()
    {
       var defaults = new System.Collections.Generic.Dictionary < string, object > ();
       defaults.Add(
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceKey,
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceDefault);
       defaults.Add(
          Hamster.States.MainMenu.SubtitleOverrideKey,
          Hamster.States.MainMenu.SubtitleOverrideDefault);
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.SetDefaultsAsync(defaults).ContinueWithOnMainThread(
          previousTask =>
          {
             FetchRemoteConfig(InitializeCommonDataAndStartGame);
          }
       );
    }
    

5. جلب وتنشيط القيم الجديدة (حسب الحاجة)

نحتاج الآن إلى إكمال طريقة FetchRemoteConfig الحالية. سيؤدي هذا إلى سلسلة من الاستدعاءات إلى أساليب Remote Config FetchAsync (التي تجلب قيمًا جديدة من Remote Config) و ActivateAsync (التي تنشط تلك القيم التي تم الحصول عليها لإتاحتها في التعليمات البرمجية) باستخدام معلمة رد الاتصال المسماة onFetchAndActivateSuccessful .

كود بدء التشغيل الذي أضفناه في الخطوة السابقة يستدعي FetchRemoteConfig مع InitializeCommonDataAndStartGame كرد اتصال لبدء اللعبة في نهاية التسلسل. يمكنك تمرير عمليات رد اتصال بديلة إلى FetchRemoteConfig لاستدعاء الجلب بنتائج مختلفة. أحد الأمثلة (الذي ستنفذه لاحقًا) هو تمرير طريقة تفتح قوائم واجهة مستخدم جديدة، والتي تعتمد على قيم التكوين عن بعد. سيؤدي هذا إلى فتح القوائم فقط بعد جلب تلك القيم وتنشيطها.

  1. الصق الكود أدناه في FetchRemoteConfig :
    public void FetchRemoteConfig(System.Action onFetchAndActivateSuccessful)
    {
       if(app==null)
       {
          Debug.LogError($"Do not use Firebase until it is properly initialized by calling {nameof(InitializeFirebaseAndStartGame)}.");
          return;
       }
    
       Debug.Log("Fetching data...");
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.FetchAsync(System.TimeSpan.Zero).ContinueWithOnMainThread(
          previousTask=>
          {
             if (!previousTask.IsCompleted)
             {
             Debug.LogError($"{nameof(remoteConfig.FetchAsync)} incomplete: Status '{previousTask.Status}'");
             return;
             }
             ActivateRetrievedRemoteConfigValues(onFetchAndActivateSuccessful);
          });
    }
    
  2. بعد ذلك، أكمل طريقة ActivateRetrievedRemoteConfigValues ، التي تتلقى رد اتصال تم تمريره، onFetchAndActivateSuccessful . عند انتهاء التنشيط، سيتم استدعاء رد الاتصال المحدد:
    private void ActivateRetrievedRemoteConfigValues(System.Action onFetchAndActivateSuccessful)
    {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var info = remoteConfig.Info;
       if(info.LastFetchStatus == LastFetchStatus.Success)
       {
          remoteConfig.ActivateAsync().ContinueWithOnMainThread(
             previousTask =>
             {
             Debug.Log($"Remote data loaded and ready (last fetch time {info.FetchTime}).");
             onFetchAndActivateSuccessful();
             });
       }
    }
    

عند استدعاء المصب بواسطة SetRemoteConfigDefaults من سياق التهيئة، يستدعي ActivateRetrievedRemoteConfigValues ​​نقطة البداية السابقة، InitializeCommonDataAndStartGame ، لبدء اللعبة عن طريق فتح القائمة الرئيسية.

6. قم بإعداد إستراتيجية تحميل التكوين عن بعد

لجلب القيم وتنشيطها في وقت آخر أثناء استخدام التطبيق، يتعين عليك استدعاء هذه الوظائف مرة أخرى، وإذا قامت أي كائنات بتخزين القيم مؤقتًا، فيجب إعلامها لإجراء التحديث. من أجل تطوير إستراتيجية لإعادة جلب قيم التكوين عن بعد، ضع في الاعتبار متى تكون القيم الجديدة مطلوبة ومتى تبدأ جلب القيم الجديدة وتنشيطها لتجنب تغييرها أثناء الاستخدام.

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

بالنظر إلى نظام قائمة Mechahamster، فإن أسهل طريقة لإضافة تحديثات قائمة حظر واجهة المستخدم هي الاتصال به قبل استئناف القائمة الرئيسية (تحديدًا عند الوصول إليها عن طريق التراجع عن قائمة أخرى) وتمرير طريقة عرض واجهة المستخدم كرد اتصال onFetchAndActivateSuccessful . يمكن فعل الشيء نفسه بالنسبة لقائمة تحديد المستوى .

مع التحميل الأولي كجزء من بدء تشغيل التطبيق، سيتم التعامل مع أي تنقل في القائمة يمر عبر القائمة الرئيسية من خلال أول هذه العناصر، في حين أن أي إعادة دخول إلى قائمة Level Select ستؤدي أيضًا إلى التحديث. لا يهم الدخول الأولي إلى قائمة تحديد المستوى لأنه لا يمكن الوصول إليه إلا من القائمة الرئيسية وبالتالي فهو مغطى بالفعل.

لتمكين ذلك في التطبيق، أكمل الطرق ذات الصلة في القائمة الرئيسية وحدد مستوى الملفات، مما سيمنع عرض واجهة المستخدم حتى يكتمل FetchAsync و ActivateAsync :

  1. افتح Assets/Hamster/Scripts/States/MainMenu.cs واستبدل طريقة Resume الحالية بما يلي:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true);
       CommonData.mainGame.FetchRemoteConfig(InitializeUI);
    }
    
  2. حفظ الملف.
  3. افتح Assets/Hamster/Scripts/States/BaseLevelSelect.cs ، واستبدل أسلوب Resume الحالي بما يلي:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.FetchRemoteConfig(ShowUI);
    }
    
  4. حفظ الملف.

7. تصحيح/التحقق من صحة سلوكيات الجلب

في هذه المرحلة، من المفيد إجراء فحص تشخيصي/تحقق من الصحة. سيسمح لك الإجراء التالي باختبار تطبيقك يدويًا وكيفية جلب قيم التكوين عن بُعد وتنشيطها.

ستتم طباعة المعلومات كجزء من سجلات المحاكاة أو الجهاز أو المحرر. بالنسبة لنظام التشغيل iOS، يمكنك عرض سجلات الجهاز والمحاكاة في Xcode. بالنسبة لنظام التشغيل Android، يمكنك عرض السجلات عن طريق تشغيل adb logcat . إذا قمت بتشغيل التعليمات البرمجية في Unity بالضغط على "تشغيل" في المحرر، فستظهر السجلات في علامة التبويب "وحدة التحكم".

  1. أعد إنشاء التطبيق وتشغيله (في المحرر، باستخدام جهاز أو جهاز محاكاة).
  2. بعد ظهور القائمة الرئيسية للعبة، قم بمراجعة مخرجات سجل اللعبة، والتي يجب أن تحتوي على السجلات التي تم إنشاؤها بواسطة Debug.Log في FetchRemoteConfig و ActivateRetrievedRemoteConfigValues ​​. يجب أن تظهر هذه الرسائل "جارٍ جلب البيانات..." و"البيانات البعيدة محملة وجاهزة". لاحظ الطوابع الزمنية في بداية هذه الرسائل.
  3. في اللعبة، اضغط على الترخيص .
  4. اضغط حسنا .
  5. انتظر حتى تظهر القائمة الرئيسية للعبة.
  6. قم بمراجعة مخرجات سجل لعبتك، والتي يجب أن تكون مشابهة لتلك الموجودة في الخطوة السابقة، مع طوابع زمنية جديدة (مطابقة الوقت المحدد على ساعة النظام حيث تقوم بتشغيل اللعبة).
  7. في اللعبة، اضغط على تشغيل .
  8. اضغط على هيا نتدحرج .
  9. قم بتمرير الكرة إلى الهدف باستخدام أسهم لوحة المفاتيح، والتي ستفتح قائمة المستوى الكامل.
  10. مستويات الصحافة .
  11. انتظر حتى يتم تحميل قائمة تحديد المستوى .
  12. قم بمراجعة مخرجات سجل لعبتك مرة أخرى. يجب أن يطابق رسائل السجل من الخطوات السابقة، مع الطوابع الزمنية الأحدث (مطابقة الوقت المحدد على ساعة النظام حيث تقوم بتشغيل اللعبة).

إذا لم يظهر أي منها في تطبيقك، فقد يكون هناك جزء من عملية الجلب والتنشيط (أو جهازك) قد تم تكوينه بشكل خاطئ. إذا لم يظهر السجل الأول، فمن المحتمل ألا تبدأ لعبتك. قم بمراجعة وحدة تحكم المحرر أو سجلات الجهاز/المحاكي بحثًا عن التحذيرات والأخطاء المتعلقة بمشروعك/بيئتك والتحقق منها - قد تكون المشكلة بسيطة مثل الاتصال بالإنترنت.

إذا ظهرت السجلات الأولية من تحميل القائمة، ولكن لم تظهر إحدى السجلات اللاحقة، فافحص/أعد تنفيذ أساليب Resume في Assets/Hamster/Scripts/States/MainMenu.cs و Assets/Hamster/Scripts/States/BaseLevelSelect.cs .

8. قم بصياغة التعليمات البرمجية الخاصة بك

الآن بعد أن قمت بتكوين قيم المعلمات داخل التطبيق في SetDefaultsAsync() وجعلت أحدث الإصدارات متاحة مع FetchAsync() و ActivateAsync() ، فسوف تقوم بالإشارة إلى هذه القيم واستخدامها في التعليمات البرمجية.

بعد أن تقوم بتعيين القيم في الواجهة الخلفية للتكوين عن بعد، وإحضارها وتنشيطها ( أو القيام بالأمرين معًا في وقت واحد )، تصبح هذه القيم متاحة لتطبيقك. لاستخدام هذه القيم، اتصل بـ GetValue(string key ) واختر مفتاح معلمة كوسيطة. يؤدي هذا إلى إرجاع ConfigValue ، الذي يحتوي على خصائص للوصول إلى القيمة كأنواع مختلفة مدعومة: string ، bool ، long ، double . في هذا المشروع ومعظم حالات استخدام الألعاب، يجب عليك تحويل النوعين الأخيرين إلى النوعين الاصطلاحيين int و float . للتأكد من أن هذه التحويلات لا تسبب مشكلات، تأكد من أن القيم الأولية المعينة في Remote Config تقع ضمن النطاق الصالح للأنواع التي ستستخدمها في رمز التطبيق الخاص بك.

  1. قم باستيراد التكوين عن بعد عن طريق الإضافة using Firebase.RemoteConfig; إلى أعلى الملفات التالية:
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. استبدل أسلوب Start الخاص بـ AccelerationTile.cs :
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    مع هذا التغيير، سيتم تغيير مقدار القوة التي ينقلها بلاط التسارع إلى القوة المستلمة من Remote Config.
  3. قم بتحرير نص طريقة InitializeUI لـ MainMenu.cs :
    private void InitializeUI() {
       if (menuComponent == null) {
          menuComponent = SpawnUI<Menus.MainMenuGUI>(StringConstants.PrefabMainMenu);
       }
    
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var subtitleOverride = JsonUtility.FromJson<Menus.MainMenuGUI.SubtitleOverride>(
          remoteConfig.GetValue(SubtitleOverrideKey).StringValue);
       // Only sets values if all fields of the override are non-default.
       if(subtitleOverride != null && subtitleOverride.IsValidOverride())
       {
          menuComponent.MenuSubtitleText.text = subtitleOverride.text;
          menuComponent.MenuSubtitleText.fontSize = subtitleOverride.fontSize;
          menuComponent.MenuSubtitleText.color = subtitleOverride.textColor;
       }
       ShowUI();
    }
    
    هنا، يتم تعيين subtitleOverride لتغيير العنوان الفرعي على شاشة القائمة الرئيسية إذا تم تعيين جميع حقولها في السحابة كقيم بخلاف القيم الافتراضية لنوعها .

9. قم بتعيين قيم المعلمات عن بعد

الآن بعد أن تم تجهيز تطبيقك بالكامل، أصبحت جاهزًا لتكوين المعلمات والقيم على خادم Remote Config. في هذا الدرس التطبيقي حول التعليمات البرمجية، سنقوم بإعداد ذلك باستخدام وحدة تحكم Firebase.

  1. في وحدة تحكم Firebase ، افتح مشروعك.
  2. حدد Remote Config من القائمة لعرض لوحة معلومات التكوين عن بعد.
  3. لكل معلمة حددتها في تطبيقك والمدرجة في الجدول التالي، انقر فوق إضافة معلمة ، والصق اسم المعلمة (المفتاح)، وحدد نوع البيانات المدرج في الجدول، وقم بتعطيل الاستخدام الافتراضي داخل التطبيق ، ثم الصق في القيمة الافتراضية الجديدة:

    اسم المعلمة (المفتاح)

    نوع البيانات

    القيمة الافتراضية

    Acceleration_tile_force

    رقم

    100

    subtitle_override

    JSON

    {"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}

    Remote Config Parameter editor with\nacceleration_tile_force populated
  4. انقر فوق حفظ لحفظ التغييرات الخاصة بك.
  5. انقر فوق نشر لنشر التكوين الجديد وإتاحة القيم الجديدة للعبتك.
  6. قم بتشغيل تطبيقك مرة أخرى بعد تعيين هذه المعلمات البعيدة ولاحظ كيفية تجاوزها للإعدادات الافتراضية الأصلية. Mechahamster main screen with Debug\nMenu enabled

10. استخدم شروط التكوين عن بعد لخدمة المتغيرات

قد ترغب في توفير تجربة التطبيق للمستخدم بناءً على اللغة التي يتحدث بها، أو مكان تواجده، أو الوقت من اليوم، أو النظام الأساسي الذي يستخدمه. تمنحك شروط التكوين عن بعد القدرة على استخدام هذه السمات وغيرها بشكل فردي أو مجتمعة لخدمة قيم مختلفة (تسمى المتغيرات) للمستخدم.

أحد الاستخدامات الشائعة للشروط هو تغيير المحتوى بين منصات iOS وAndroid. اتبع الخطوات أدناه لتنفيذ شرط يخدم قيمة مختلفة لـ subtitle_override اعتمادًا على النظام الأساسي قيد الاستخدام.

  1. افتح علامة التبويب "التكوين عن بعد" الخاصة بمشروعك في وحدة تحكم Firebase .
  2. انقر فوق زر التحرير لـ subtitle_override.
  3. في الزاوية اليسرى السفلية، انقر فوق إضافة جديد .
  4. في القائمة المنسدلة التي تظهر، قم بالتمرير فوق القيمة الشرطية وانقر فوق إنشاء شرط جديد. Remote Config parameter editor:\nConditional value option
  5. عندما يُطلب منك ذلك، قم بتسمية الشرط "is iOS" إذا كنت تستهدف iOS، أو "is Android" إذا كنت تستهدف Android. إذا كنت تستهدف كليهما، فما عليك سوى اختيار أحدهما هنا واستخدامه لبقية الدرس التطبيقي حول التعليمات البرمجية. Using the Define a new condition\ndialog to define an iOS-specific condition
  6. ضمن ينطبق إذا... ، انقر فوق القائمة المنسدلة تحديد... وحدد النظام الأساسي . ثم قم باختيار النظام الأساسي المناسب. Using the Define a new condition\neditor to select the iOS platform
  7. انقر فوق إنشاء شرط لإنشاء الشرط. يظهر مربع حوار تحرير المعلمة مرة أخرى ويمكنك الآن تعيين قيمة:
    • إذا كنت تستهدف Android، فاضبط القيمة على:
      {"text":"Level Up Android Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
    • إذا كنت تستهدف iOS، فاضبط القيمة على:
      {"text":"Level Up iOS Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
  8. انقر فوق حفظ لحفظ التغييرات الخاصة بك.
  9. انقر فوق نشر لنشر التكوين الجديد وإتاحة القيم الجديدة للعبتك.

إذا قمت بإنشاء اللعبة وتشغيلها مرة أخرى، فيجب أن تشاهد استبدال العنوان الفرعي للعبة بالمتغير الخاص بالمنصة الخاصة بها.

11. قم بتكوين Remote Config لتلقي التحديثات في الوقت الفعلي

يمكن لـ Remote Config الآن الاستماع إلى التحديثات الخاصة بقوالب التكوين عن بعد والتعامل معها في الوقت الفعلي . يمكن للتطبيقات الاشتراك في واجهة برمجة التطبيقات Remote Config API الجديدة في الوقت الفعلي للاستماع إلى تغييرات التكوين والقيم المحدثة.

كيف تعمل

للاستماع إلى التحديثات، يجب على تطبيقك تنفيذ طريقة تشترك في حدث OnConfigUpdateListener . أثناء اشتراك واحد أو أكثر من مستمعي تحديث التكوين، سيتم جلب قوالب التكوين عن بعد الجديدة تلقائيًا، ويتم استدعاء المعالجات المشتركة ويمكن استخدامها لتنفيذ المنطق في الاستجابة، مثل تنشيط القيم الجديدة وإتاحتها لبقية التطبيق.

تنفيذ التكوين عن بعد في الوقت الحقيقي

لتوضيح كيفية عمل ذلك في اللعبة، قم بإجراء التغييرات التالية على التعليمات البرمجية الخاصة بك.

قم بإنشاء معالج تحديث التكوين

الخطوة الأولى لاستخدام حدث Config Update هي إنشاء طريقة قادرة على الاستماع إليه. ضع الطريقة التالية في Assets/Hamster/Scripts/MainGame.cs :

   void ActivateValuesOnConfigUpdate( object sender, ConfigUpdateEventArgs args)
   {
      if (args.Error != RemoteConfigError.None) {
         Debug.Log($"Error occurred while listening: {args.Error}");
         return;
      }

      Debug.Log("Updated keys: " + string.Join(", ", args.UpdatedKeys));
      // Activate all fetched values and then logs.
      var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
      remoteConfig.ActivateAsync().ContinueWithOnMainThread(
         task => {
            Debug.Log($"Keys from {nameof(ActivateValuesOnConfigUpdate)} activated.");
         });
   }

ستقوم هذه الطريقة بطباعة قائمة بالمفاتيح المحدثة ورسالة نجاح إلى السجل عندما تقوم بتنشيط القيم الجديدة.

اشترك في حدث التحديث

لتنشيط ActivateValuesOnConfigUpdate عند استدعاء الحدث، قم بالاشتراك في الحدث. استبدل الأسلوب InitializeCommonDataAndStartGame() في Assets/Hamster/Scripts/MainGame.cs بما يلي:

   void InitializeCommonDataAndStartGame()
   {
      CommonData.prefabs = FindObjectOfType<PrefabList>();
      CommonData.mainCamera = FindObjectOfType<CameraController>();
      CommonData.mainGame = this;

      Screen.orientation = ScreenOrientation.LandscapeLeft;

      musicPlayer = CommonData.mainCamera.GetComponentInChildren<AudioSource>();

      CommonData.gameWorld = FindObjectOfType<GameWorld>();

      // Set up volume settings.
      MusicVolume = PlayerPrefs.GetInt(StringConstants.MusicVolume, MaxVolumeValue);
      // Set the music to ignore the listeners volume, which is used for sound effects.
      CommonData.mainCamera.GetComponentInChildren<AudioSource>().ignoreListenerVolume = true;
      SoundFxVolume = PlayerPrefs.GetInt(StringConstants.SoundFxVolume, MaxVolumeValue);

      // Subscribes to on config update after first initial fetch and activate
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener += ActivateValuesOnConfigUpdate;

      stateManager.PushState(new States.MainMenu());
   }

السطر الجديد (الذي ينتهي بـ += ActivateValuesOnConfigUpdate; ) يشترك في معالج الحدث في الحدث.

قم بإلغاء الاشتراك عندما يتم تدمير الكائن الخاص بالمعالج

من أجل منع الأخطاء المرجعية الفارغة، يجب على الكائنات ذات الأساليب المشتركة في الأحداث إلغاء اشتراك تلك الطريقة عند تدميرها. أضف الطريقة التالية إلى Assets/Hamster/Scripts/MainGame.cs :

   private void OnDestroy() 
   {
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ActivateValuesOnConfigUpdate;
   }

اختبار الوظيفة الجديدة

للتحقق من صحة الوظيفة الجديدة، جرّب تطبيقك المدمج. يتطلب الإجراء التالي أن تتمكن من قراءة السجل وتصحيح الأخطاء باستخدام جهاز حقيقي .

قم بتغيير acceleration_tile_force ولاحظ

بعد بدء تطبيقك، في قسم Remote Config بوحدة تحكم Firebase:

  1. اضغط على زر التعديل الموجود بجوار acceleration_tile_force .

dc602d4db54e50a4.png

  1. غيّر القيمة إلى "120" ثم اضغط على "حفظ" .

fcbc1df848f88009.png

  1. انقر فوق الزر نشر التغييرات .

3785c1e00e7a6359.png

  1. فحص السجل.
  2. إذا رأيت رسالة سجل تبدأ بـ "حدث خطأ أثناء الاستماع"، فاقرأ بقية الرسالة وحاول تصحيح الأخطاء باستخدام رسالة الخطأ التي تطبعها.
  3. إذا رأيت سجلاً يبدأ بـ "المفاتيح المحدثة"، فهذا يعني أن تطبيقك قد تلقى القيم التي تم تغييرها.
  4. إذا لم ترَ أيًا منهما، فابحث في بقية سجلاتك ثم أعد مراجعة الإرشادات من إنشاء معالج تحديث التكوين ، وأعد اختبار السجلات وأعد فحصها لتحديد ما إذا كان هناك أي شيء خاطئ.

12. تهانينا!

لقد استخدمت Remote Config للتحكم في القيم داخل اللعبة عن بُعد عن طريق جلبها في تطبيقك واستخدام الشروط لخدمة متغيرات مختلفة!

ما قمنا بتغطيته

  • كيفية تعيين واسترجاع قيم التكوين عن بعد
  • كيفية استخدام رمز Unity C# الخاص بك لاستخدام القيم المستردة
  • كيفية تخزين القيم/الكائنات المركبة وأدواتها وتجاوزها كقيم JSON
  • كيفية استخدام شروط التكوين عن بعد لخدمة متغيرات القيمة المختلفة

الخطوات التالية

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