1- مقدمة
يمكنك استخدام ميزة "الإعداد عن بُعد في Firebase" من أجل تحديد أزواج المفتاح/القيمة في تطبيقك، المعروفة أيضًا باسم المَعلمات، وتعديل قيمها في السحابة الإلكترونية، ما يسمح لك بتعديل مظهر تطبيقك وسلوكه بدون توزيع تحديث للتطبيق.
ستضيف هذه الوظيفة الجديدة إلى نموذج لعبة، MechaHamster: Level Up with Firebase Edition. هذه اللعبة النموذجية هي إصدار جديد من لعبة Firebase الكلاسيكية MechaHamster التي تزيل معظم وظائف Firebase المدمجة، ما يتيح لك إمكانية تنفيذ استخدامات جديدة لمنصة Firebase بدلاً منها.
للتأكّد من أنّ تطبيقك يعمل على النحو المطلوب، ستضبط الإعدادات التلقائية للقيم في نموذج رمز اللعبة، ويمكن إلغاء هذه القيم من خلال القيم التي حدّدتها في ميزة "الإعداد عن بُعد" في وحدة تحكُّم Firebase.
المعلومات التي ستطّلع عليها
- كيفية ضبط قيم "الإعداد عن بُعد" في السحابة الإلكترونية واستردادها
- كيفية قياس حالة رمز Unity C# من أجل استخدام القيم المسترجعة تلقائيًا
- كيفية تخزين القيم/الكائنات المركبة كقيم JSON واستخدامها وتجاوزها
- طريقة استخدام شروط "الإعداد عن بُعد" لعرض خيارات مختلفة للقيمة لمجموعات مختلفة من المستخدمين
المتطلبات
- Unity 2019.1.0f1 أو إصدار أحدث مع دعم إصدار iOS و/أو Android
- جهاز فعلي Android/iOS أو جهاز محاكاة/محاكي لإنشاء اللعبة وتشغيلها
2- إعداد بيئة التطوير
توضّح الأقسام التالية كيفية تنزيل رمز المستوى الأعلى باستخدام Firebase وفتحه في Unity وإضافة مشروع Firebase. تستخدم العديد من الدروس التطبيقية الأخرى حول الترميز في Firebase وUnity هذا النموذج من ألعاب "رفع مستوى التقدّم مع Firebase"، لذا قد تكون أكملت المهام الواردة في هذا القسم. في هذه الحالة، يمكنك تخطّي هذه الخطوات والمتابعة إلى إضافة حِزم تطوير البرامج (SDK) لمنصة Firebase لبرنامج Unity لإضافة ميزة "الإعداد عن بُعد" إلى نموذج رمز اللعبة.
تنزيل الرمز
استنسِخ مستودع GitHub في هذا الدرس التطبيقي من سطر الأوامر:
git clone https://github.com/firebase/level-up-with-firebase
يمكنك بدلاً من ذلك تنزيل المستودع كملف ZIP إذا لم يكن git مثبّتًا لديك.
افتح level Up باستخدام Firebase في محرِّر Unity
- افتح Unity Hub، ومن علامة التبويب المشاريع، انقر على سهم القائمة المنسدلة بجانب فتح.
- انقر على إضافة مشروع من القرص.
- انتقِل إلى الدليل الذي يحتوي على الرمز، ثم انقر على حسنًا.
- اختَر إصدار محرِّر Unity لاستخدامه والنظام الأساسي المستهدَف (Android أو iOS)، إذا طُلب منك ذلك.
- انقر على اسم المشروع، level-up-with-firebase، وسيتم فتح المشروع في محرِّر Unity.
- إذا لم يفتح المحرّر تلقائيًا، افتح
MainGameScene
في مواد العرض >. همستر في علامة التبويب المشروع في Unity Editor.
لمزيد من المعلومات حول تثبيت Unity واستخدامه، يُرجى الاطّلاع على مقالة العمل في Unity.
3- إضافة Firebase إلى مشروع Unity
إنشاء مشروع على Firebase
- في وحدة تحكُّم Firebase، انقر على إضافة مشروع.
- لإنشاء مشروع جديد، أدخِل اسم المشروع المطلوب.
سيؤدي ذلك أيضًا إلى ضبط رقم تعريف المشروع (المعروض أسفل اسم المشروع) على رقم استنادًا إلى اسم المشروع. يمكنك النقر على الرمز تعديل في رقم تعريف المشروع اختياريًا لتخصيصه بشكل أكبر. - راجِع بنود Firebase واقبلها إذا طُلب منك ذلك.
- انقر على متابعة.
- حدِّد الخيار تفعيل "إحصاءات Google" لهذا المشروع، ثمّ انقر على متابعة.
- اختَر حسابًا حاليًا على "إحصاءات Google" لاستخدامه أو اختَر إنشاء حساب جديد لإنشاء حساب جديد.
- انقر على إنشاء مشروع.
- عند إنشاء المشروع، انقر على متابعة.
تسجيل تطبيقك في Firebase
- افتح وحدة تحكُّم Firebase، وفي وسط صفحة النظرة العامة على المشروع، انقر على رمز Unity لبدء سير عمل الإعداد أو إذا سبق لك إضافة تطبيق إلى مشروع Firebase، انقر على إضافة تطبيق لعرض خيارات النظام الأساسي.
- اختر تسجيل أهداف الإصدار من Apple (iOS) وAndroid.
- أدخِل أرقام التعريف الخاصة بالمنصّة الخاصة بمشروع Unity. بالنسبة إلى هذا الدرس التطبيقي، أدخِل ما يلي:
- بالنسبة إلى Apple (iOS): أدخِل
com.google.firebase.level-up
في حقل معرّف حزمة iOS. - لنظام التشغيل Android: أدخِل
com.google.firebase.level_up
في حقل اسم حزمة Android.
- بالنسبة إلى Apple (iOS): أدخِل
- يمكنك اختياريًا إدخال أسماء مستعارة خاصة بمنصة مشروع Unity.
- انقر على تسجيل التطبيق وتابِع إلى القسم تنزيل ملف الإعداد.
- كرِّر العملية لأي هدف إصدار لم تطبّقه في المرة الأولى.
إضافة ملفات إعداد Firebase
بعد النقر على تسجيل التطبيق، سيُطلب منك تنزيل ملفَّي إعداد (ملف إعداد واحد لكل هدف إصدار). يحتاج مشروع Unity إلى البيانات الوصفية لمنصّة Firebase في هذه الملفات للاتصال بمنصّة Firebase.
- تنزيل ملفي التهيئة المتاحين:
- بالنسبة إلى Apple (iOS): نزِّل GoogleService-Info.plist.
- على أجهزة Android: نزِّل google-services.json.
- افتح نافذة المشروع في مشروع Unity، ثم انقل ملفي الإعداد إلى مجلد Assets.
- في "وحدة تحكُّم Firebase" ضمن سير عمل الإعداد، انقر على التالي وانتقِل إلى "إضافة حِزم تطوير البرامج (SDK) لمنصة Firebase لبرنامج Unity".
ملاحظة: يمكنك دائمًا إعادة تنزيل هذه الملفات في وقت لاحق من خلال فتح الإعدادات العامة لمشروعك، والتمرير للأسفل إلى قسم تطبيقاتك، ثم النقر على زر التنزيل لملف الضبط المطلوب.
إضافة حِزم تطوير البرامج (SDK) لمنصة Firebase لبرنامج Unity
- انقر على تنزيل حزمة تطوير البرامج (SDK) لمنصة Firebase Unity في وحدة تحكّم Firebase.
- احرص على فكّ ضغط حزمة SDK في مكان مناسب.
- في مشروع Unity المفتوح، انتقِل إلى Assets > استيراد حزمة > الحزمة المخصّصة:
- في مربّع الحوار استيراد الحزمة، انتقِل إلى الدليل الذي يحتوي على حزمة SDK غير المضغوطة، واختَر
FirebaseAnalytics.unitypackage
، ثمّ انقر على فتح. - من مربّع الحوار استيراد حزمة Unity الذي يظهر، انقر على استيراد.
- كرر الخطوات السابقة لاستيراد الحزمتين التاليتين:
FirebaseRemoteConfig.unitypackage
FirebaseCrashlytics.unitypackage
Crashlytics هو تقرير خفيف عن الأعطال في الوقت الفعلي يساعدك على تتبُّع المشاكل التي تؤدي إلى ضعف جودة تطبيقك وتحديد أولوياتها وحلّها. إذا لم يسبق لك استخدامها، ننصحك بإكمال المسار التعليمي في Crashlytics for Unity.
- ارجع إلى "وحدة تحكُّم Firebase" وانقر على التالي في سير عمل الإعداد.
لمزيد من المعلومات حول إضافة حِزم تطوير البرامج (SDK) لمنصة Firebase إلى مشاريع Unity، يمكنك الاطّلاع على الخيارات الإضافية لتثبيت Unity.
4. ضبط الإعدادات التلقائية لميزة "الإعداد عن بُعد" واسترجاع قيم جديدة
في هذا الدرس التطبيقي، ستُعدِّل العناصر التي تستخدم القيم المحدّدة في الرمز البرمجي أو الكائنات المتسلسلة في محرِّر Unity لاستخدام القيم التي يتم قياسها من خلال ميزة "الإعداد عن بُعد". عليك ضبط القيم التلقائية لكل مَعلمة باستخدام SetDefaultsAsync
حتى يعمل تطبيقك على النحو المطلوب قبل الاتصال بواجهة "الإعداد عن بُعد". سيبقى تطبيقك محدّثًا من خلال استرجاع قيم جديدة من ميزة "الإعداد عن بُعد" وتفعيلها لتصبح قابلة للاستخدام في الرموز البرمجية.
لاسترجاع قيم جديدة من ميزة "الإعداد عن بُعد"، هناك عدد من الطرق غير المُنفّذة والمتوفّرة حاليًا في ملف Assets/Hamster/Scripts/MainGame.cs
ويجب إكمالها.
- أضِف عبارات
using
التالية إلىMainGame.cs
: تحتوي وحدةusing Firebase.Crashlytics; using Firebase.Extensions; using Firebase.RemoteConfig;
Firebase.Extensions
على بعض الإضافات في واجهة برمجة تطبيقات "مهام Google" في C# التي ستساعد في تسهيل إدارة عملية الإعداد من خلال عمليات معاودة الاتصال. - أضِف إعداد Firebase إلى طريقة
Start()
MainGame.cs
من خلال استبدال طريقة InitializeCommonDataAndStartGame() الحالية بالطريقة غير المنفذة حاليًا، وهيInitializeFirebaseAndStartGame()
:void Start() { Screen.SetResolution(Screen.width / 2, Screen.height / 2, true); InitializeFirebaseAndStartGame(); }
- في
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"); } }); }
- يستدعي إعداد 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
الحالية. سيؤدي هذا إلى سلسلة عمليات الاستدعاء لطرق "الإعداد عن بُعد" FetchAsync
(التي تجلب القيم الجديدة من "الإعداد عن بُعد") وActivateAsync
(التي تفعِّل القيم التي تم الحصول عليها لإتاحتها في الرمز) باستخدام مَعلمة استدعاء تُسمّى onFetchAndActivateSuccessful
.
يستدعي رمز بدء التشغيل الذي أضفناه في الخطوة السابقة FetchRemoteConfig
مع InitializeCommonDataAndStartGame
كرد الاتصال لبدء اللعبة في نهاية التسلسل. يمكنك تمرير استدعاءات بديلة إلى FetchRemoteConfig
لاستدعاء الجلب بنتائج مختلفة. وهناك مثال (ستنفّذه لاحقًا) في طريقة تفتح قوائم جديدة لواجهة المستخدم، تعتمد على قيم "الإعداد عن بُعد". سيؤدي ذلك إلى فتح القوائم فقط بعد استرجاع تلك القيم وتفعيلها.
- الصق الرمز أدناه في
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); }); }
- بعد ذلك، أكمِل طريقة
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
. ويمكن تنفيذ الإجراء نفسه على القائمة اختيار المستوى.
عند التحميل الأولي كجزء من بدء تشغيل التطبيق، سيتم التعامل مع أيّ عملية تنقّل في القائمة تمر عبر القائمة الرئيسية من خلال أولهما، في حين أنّ إعادة الدخول للقائمة اختيار المستوى سيؤدي أيضًا إلى إعادة التحميل. لا يهم المدخل الأولي لقائمة اختيار المستوى حيث لا يمكن الوصول إليه إلا من القائمة الرئيسية وبالتالي تكون مشمولة بالفعل.
لتفعيل هذه الميزة في التطبيق، عليك إكمال الطرق ذات الصلة في القائمة الرئيسية وملفات اختيار المستوى، ما سيؤدي إلى حظر عرض واجهة المستخدم حتى اكتمال FetchAsync
وActivateAsync
:
- افتح
Assets/Hamster/Scripts/States/MainMenu.cs
واستبدِل طريقةResume
الحالية بما يلي:public override void Resume(StateExitValue results) { CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true); CommonData.mainGame.FetchRemoteConfig(InitializeUI); }
- احفظ الملف.
- افتح
Assets/Hamster/Scripts/States/BaseLevelSelect.cs
، واستبدِل طريقةResume
الحالية بما يلي:public override void Resume(StateExitValue results) { CommonData.mainGame.FetchRemoteConfig(ShowUI); }
- احفظ الملف.
7- تصحيح الأخطاء أو التحقّق من صحة سلوكيات الجلب
في هذه المرحلة، من المفيد إجراء فحص تشخيصي/التحقّق من الصحة. سيتيح لك الإجراء التالي اختبار تطبيقك يدويًا ومعرفة كيفية أو ما إذا كان يجلب قيم ميزة "الإعداد عن بُعد" ويفعّلها.
ستتم طباعة المعلومات كجزء من سجلات المحاكي أو الجهاز أو المحرِّر. بالنسبة إلى iOS، يمكنك الاطّلاع على سجلات الأجهزة والمحاكيات في Xcode. بالنسبة إلى نظام التشغيل Android، يمكنك الاطّلاع على السجلّات من خلال تشغيل adb logcat
. إذا شغّلت الرمز في Unity من خلال الضغط على "تشغيل" في المحرِّر، ستظهر السجلات في علامة التبويب "وحدة التحكّم".
- أعِد إنشاء التطبيق وشغِّله (في "المحرّر"، باستخدام جهاز أو محاكي).
- بعد ظهور القائمة الرئيسية للعبة، راجِع مخرجات اللعبة التي يجب أن تحتوي على السجلات التي تم إنشاؤها من خلال
Debug.Log
في "FetchRemoteConfig
" و"ActivateRetrievedRemoteConfigValues
". من المفترض أن تظهر الرسالة "جارٍ جلب البيانات..." و"تم تحميل البيانات عن بُعد وأصبحت جاهزة" الرسائل. يُرجى ذكر الطوابع الزمنية في بداية هذه الرسائل. - في اللعبة، اضغط على الترخيص.
- انقر على حسنًا.
- الانتظار حتى تظهر القائمة الرئيسية الخاصة باللعبة
- راجِع مخرجات اللعبة، التي من المفترض أن تكون مشابهة لتلك الواردة في الخطوة السابقة، مع طوابع زمنية جديدة (متطابقة مع الوقت المحدّد في ساعة النظام التي تشغّل فيها اللعبة).
- اضغط على تشغيل داخل اللعبة.
- اضغط على Let's Roll.
- انتقل بالكرة إلى الهدف باستخدام أسهم لوحة المفاتيح، والتي ستفتح قائمة "إكمال المستوى".
- اضغط على المستويات.
- انتظِر إلى أن يتم تحميل قائمة اختيار المستوى.
- راجِع مخرجات سجلّ اللعبة مرة أخرى. ويجب أن تتطابق مع رسائل السجلّ الواردة في الخطوات السابقة، مع طوابع زمنية أحدث (تتطابق مع الوقت المحدّد في ساعة النظام التي تشغّل فيها اللعبة).
وإذا لم يظهر أيٌ منها في تطبيقك، قد يكون جزء من مسار الجلب والتفعيل (أو على جهازك) قد تم ضبطه بشكل خاطئ. إذا لم يظهر السجل الأول، فمن المحتمل ألا تبدأ لعبتك. راجِع سجلات وحدة تحكّم "محرّر إعلانات Google" أو سجلّات الجهاز/المحاكي بحثًا عن أي تحذيرات وأخطاء متعلّقة بمشروعك أو بيئتك، وتحقق منها، فقد تكون المشكلة بسيطة مثل الاتصال بالإنترنت.
إذا ظهرت السجلّات الأولية من تحميل القائمة، ولكن لم تظهر إحدى السجلّات اللاحقة، يمكنك التحقّق من طريقة 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
الأكثر تحديدًا. لضمان عدم حدوث مشاكل في هذه الإحالات الناجحة، تأكَّد من أنّ القيم الأولية المحدَّدة في ميزة "الإعداد عن بُعد" تندرج ضمن النطاق الصالح للأنواع التي ستستخدمها في رمز تطبيقك.
- استيراد الإعداد عن بُعد من خلال إضافة
using Firebase.RemoteConfig;
إلى أعلى الملفات التالية:Assets/Hamster/Scripts/States/MainMenu.cs
Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
- استبدال طريقة
Start
لـAccelerationTile.cs
: من خلال هذا التغيير، سيتم تغيير مقدار القوة الناتجة عن مربّع التسريع إلى مقدار القوة المُستلَمة من خلال ميزة "الإعداد عن بُعد".private void Start() { var remoteConfig = FirebaseRemoteConfig.DefaultInstance; Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue; }
- تعديل نص طريقة
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- ضبط قيم المَعلمات عن بُعد
أصبحت الآن جاهزًا لضبط المَعلمات والقيم على خادم "الإعداد عن بُعد" بعد أن أصبح تطبيقك يعمل بشكل كامل. في هذا الدرس التطبيقي حول الترميز، سنتولى عملية إعداد هذا باستخدام وحدة تحكُّم Firebase.
- افتح مشروعك في وحدة تحكُّم Firebase.
- اختَر "الإعداد عن بُعد" من القائمة لعرض لوحة بيانات "الإعداد عن بُعد".
- بالنسبة إلى كلّ من المَعلمات التي حدّدتها في تطبيقك ومُدرَجة في الجدول التالي، انقر على إضافة مَعلمة، والصقها في اسم المَعلمة (المفتاح)، واختَر نوع البيانات المُدرَج في الجدول، وأوقِف استخدام الإعدادات التلقائية داخل التطبيق وألصِق القيمة التلقائية الجديدة:
اسم المَعلمة (المفتاح)
نوع البيانات
القيمة التلقائية
القوة_التقوية_للتسارع
الرقم
100
إلغاء_العنوان الفرعي
JSON
{"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
- انقر على حفظ لحفظ التغييرات.
- انقر على نشر لنشر الإعدادات الجديدة وإتاحة القيم الجديدة للعبتك.
- يمكنك تشغيل تطبيقك مرة أخرى بعد ضبط هذه المعلمات عن بُعد ومراقبة كيفية إلغاء هذه المعلمات التلقائية الأصلية.
10- استخدام شروط "الإعداد عن بُعد" لعرض خيارات المنتج
قد ترغب في تلبية تجربة التطبيق للمستخدم بناءً على اللغة التي يتحدث بها، أو مكانه، أو الوقت من اليوم، أو النظام الأساسي الذي يستخدمه. تمنحك شروط الإعداد عن بُعد إمكانية استخدام هذه السمات وغيرها من السمات بشكل فردي أو معًا لعرض قيم مختلفة للمستخدم (تُعرف باسم الصيغ.)
أحد الاستخدامات الشائعة للشروط هو تغيير المحتوى بين نظامي التشغيل iOS وAndroid الأساسيين. اتّبِع الخطوات التالية لتنفيذ شرط يعرض قيمة مختلفة للسمة subtitle_override
بناءً على النظام الأساسي المُستخدم.
- افتح علامة تبويب "الإعداد عن بُعد" الخاصة بمشروعك في وحدة تحكُّم Firebase.
- انقر على زر التعديل في
subtitle_override.
. - في أسفل يمين الشاشة، انقر على إضافة فلتر جديد.
- في القائمة المنسدلة التي تظهر، مرِّر مؤشر الماوس فوق القيمة الشرطية وانقر على إنشاء شرط جديد.
- أدخِل اسمًا للشرط "هو iOS" عندما يُطلب منك ذلك. إذا كنت تستهدف iOS أو "نظام التشغيل Android" إذا كنت تستهدف Android. وإذا كنت تستهدف كليهما، ما عليك سوى اختيار أحدهما هنا واستخدامه في بقية الدرس التطبيقي حول الترميز.
- ضمن يسري إذا...، انقر على القائمة المنسدلة اختيار... واختَر النظام الأساسي. وبعد ذلك، اختَر المنصّة المناسبة.
- انقر على إنشاء شرط لإنشاء الشرط. سيظهر مربع الحوار "تعديل المَعلمة" مرة أخرى، ويمكنك الآن ضبط قيمة:
- إذا كنت تستهدف 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}}
- إذا كنت تستهدف Android، اضبط القيمة على:
- انقر على حفظ لحفظ التغييرات.
- انقر على نشر لنشر الإعدادات الجديدة وإتاحة القيم الجديدة للعبتك.
إذا صمّمت اللعبة وشغلتها من جديد، من المفترَض أن يتم استبدال العنوان الفرعي الخاص باللعبة بالصيغة الخاصة بالنظام الأساسي.
11- ضبط ميزة "الإعداد عن بُعد" لتلقّي آخر الأخبار في الوقت الفعلي
أصبح بإمكان ميزة "الإعداد عن بُعد" الاستماع إلى تعديلات نماذج "الإعداد عن بُعد" والتعامل معها في الوقت الفعلي. ويمكن للتطبيقات الاشتراك في واجهة برمجة التطبيقات Remote Config API الجديدة في الوقت الفعلي للاستماع إلى التغييرات في الإعدادات والقيم المعدّلة.
آلية العمل
للاطّلاع على آخر المعلومات، يجب أن يستخدم تطبيقك طريقة تتيح الاشتراك في فعالية "OnConfigUpdateListener
". على الرغم من اشتراك واحد أو أكثر من أدوات معالجة تحديثات الإعدادات، سيتم استرجاع نماذج "الإعداد عن بُعد" الجديدة تلقائيًا، ويتم استدعاء المعالِجات المشترِكة ويمكن استخدامها لتنفيذ الإجراءات المنطقية استجابةً، مثل تفعيل القيم الجديدة وإتاحتها لبقية التطبيق.
تنفيذ ميزة "الإعداد عن بُعد في الوقت الفعلي"
لتوضيح كيفية عمل ذلك في اللعبة، يمكنك إجراء التغييرات التالية على الرمز.
إنشاء معالِج تحديث الإعداد
تتمثل الخطوة الأولى لاستخدام حدث "تحديث الإعداد" في إنشاء طريقة يمكنها الاستماع إليه. ضع الطريقة التالية في 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
والملاحظة
بعد بدء تشغيل التطبيق، انتقِل إلى قسم "الإعداد عن بُعد" في وحدة تحكُّم Firebase:
- اضغط على زر التعديل بجانب "
acceleration_tile_force
".
- غيِّر القيمة إلى "120". ثم اضغط على حفظ.
- انقر على الزر نشر التغييرات.
- افحص السجلّ.
- إذا ظهرت لك رسالة سجلّ تبدأ بعبارة "حدث خطأ أثناء الاستماع"، وقراءة الباقي ومحاولة تصحيح الأخطاء برسالة الخطأ التي تطبعها.
- إذا ظهر لك سجل يبدأ بـ "المفاتيح المحدّثة"، استلم تطبيقك القيم المتغيرة.
- وإذا لم تظهر لك أي منهما، ابحث في بقية السجلات، ثم أعِد مراجعة التعليمات من صفحة إنشاء معالج تحديث الضبط، وأعِد اختبار السجلات، وأعِد التحقّق منها لتحديد ما إذا كان هناك خطأ.
12- تهانينا
لقد استخدمت ميزة "الإعداد عن بُعد" للتحكّم في القيم داخل اللعبة عن بُعد، وذلك من خلال استرجاعها في تطبيقك واستخدام شروط لتوفير خيارات مختلفة.
المواضيع التي تناولناها
- طريقة ضبط قيم "الإعداد عن بُعد" واستردادها
- كيفية قياس رمز Unity C# لاستخدام القيم المسترجعة
- كيفية تخزين القيم/الكائنات المركبة كقيم JSON واستخدامها وإلغائها
- كيفية استخدام شروط "الإعداد عن بُعد" لعرض خيارات مختلفة للقيم
الخطوات التالية
يمكنك الاطّلاع على أولوية قيمة المَعلمة للتعرُّف بشكل أفضل على منطق القيم التي يتم الحصول عليها من خلال مثيل التطبيق عندما يستخدم مَعلمة ذات قيم متعدّدة (بسبب الشروط أو المنطقة المحلية).