1. مقدمة
تشكّل الإعلانات جزءًا مهمًا من تجربة المستخدم الشاملة في تطبيقك. يمكن أن تساعد عمليات تنفيذ الإعلانات بشكل جيد في تحسين تجربة التطبيق بشكل عام، بل وتحسين معدّل الاحتفاظ بالمستخدمين وتفاعلهم. على سبيل المثال، تتيح لك الإعلانات مقابل مكافآت مكافأة المستخدمين بعملة أو عناصر داخل التطبيق مقابل مشاهدة إعلانات الفيديو، ما يتيح لهم تحقيق إنجازات جديدة كان من الممكن أن يتعذّر عليهم تحقيقها ويؤدي إلى توقّفهم عن استخدام التطبيق.
ومع ذلك، ليس من السهل تقديم تجربة إعلانات ممتازة. قد تطرح أسئلة مثل: ما هو معدّل عرض هذه الإعلانات؟ أين ومتى يجب عرضها؟ ما هي الجائزة؟ للأسف، يختلف الجواب من تطبيق إلى آخر ومن موضع إعلان إلى آخر. ما مِن إجابة موحّدة لهذا السؤال.
باستخدام "إحصاءات Google لبرنامج Firebase" وAdMob والعديد من الأدوات الفعّالة الأخرى التي يوفّرها Firebase والتي تتسم بسهولة الاستخدام، أصبح من الأسهل بكثير تحسين تطبيقك بطريقة مستندة إلى البيانات. سنوضّح لك اليوم كيفية البدء.
ما ستنشئه
هذا الدرس التطبيقي حول الترميز هو الأول من ثلاثة دروس تطبيقية حول الترميز ستساعدك في إنشاء تطبيق باسم اختبار الرسم الرائع، وهي لعبة تتيح للاعبين تخمين اسم الرسم. ستوضّح لك هذه العيّنة كيف يمكنك دمج "الإعلانات مقابل مكافآت" وخدمات Firebase في لعبتك.
في هذا الدرس العملي، ستدمج "إحصاءات Google لبرنامج Firebase" لتسجيل بعض أحداث التطبيق المهمة. ستتعرّف أيضًا على كيفية قراءة إحصاءات التطبيقات المعروضة في "وحدة تحكّم Firebase".
|
|
ما ستتعلمه
- كيفية إعداد "إحصاءات Google لـ Firebase" في تطبيقك
- كيفية تسجيل أحداث التطبيق
- كيفية قراءة إحصاءات التطبيق المعروضة في وحدة تحكّم Firebase
المتطلبات
- Unity 2018.4.4f1 أو إصدار أحدث
- Xcode 10 أو إصدار أحدث (لإنشاء الهدف لنظام التشغيل iOS)
- حساب Google
- جهاز اختبار يعمل بالإصدار 5.0 من نظام التشغيل Android أو إصدار أحدث مع كابل USB لتوصيل جهازك، أو Android Emulator يعمل على الجهاز الافتراضي المتوافق مع Android(AVD) مع صورة نظام متوافقة مع "متجر Play" أو Google APIs
- جهاز iOS أو محاكي يعمل بالإصدار 8.0 من نظام التشغيل iOS أو إصدار أحدث
ما هو تقييمك لمستوى خبرتك في AdMob؟
ما هو تقييمك لمستوى خبرتك في Firebase؟
2. إعداد بيئة التطوير
تنزيل الرمز
انقر على الزر التالي لتنزيل كل الرموز البرمجية لهذا الدرس التطبيقي حول الترميز:
فكّ ضغط ملف ZIP الذي تم تنزيله. سيؤدي ذلك إلى فك ضغط مجلد رئيسي باسم admob-firebase-codelabs-unity-master.
...أو استنسِخ مستودع GitHub من سطر الأوامر.
$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-unity
يحتوي المستودع على أربعة مجلدات على النحو التالي:
-
101-base: الرمز الأولي الذي ستنشئه في هذا الدرس التطبيقي حول الترميز -
101-complete_and_102-base: الرمز البرمجي المكتمل لهذا الدرس التطبيقي حول الترميز والرمز البرمجي الأساسي للدرس التطبيقي حول الترميز رقم 102 -
102-complete: الرمز المكتمل للدرس التطبيقي حول الترميز رقم 102
تحضير الملفات المطلوبة
تستخدم لعبة اختبار الرسم الرائع عدة رموز برمجية مفتوحة المصدر، وهي مطلوبة لتجميع المشروع وتشغيله.
افتح الوحدة الطرفية وانتقِل إلى دليل الجذر للمستودع. بعد ذلك، شغِّل ./gradlew :prepareThirdPartyFiles (gradlew.bat :prepareThirdPartyFiles على نظام التشغيل Windows) من الوحدة الطرفية لنسخ الملفات المطلوبة إلى المشروع.
استيراد تطبيق البداية
شغِّل Unity، ثم اختَر "فتح" في شاشة الترحيب. بعد ذلك، اختَر دليل 101-base من الرمز الذي نزّلته.
يجب أن يكون المشروع مفتوحًا الآن في Unity.
3- إعداد وحدة لإعلانات الفيديو مقابل مكافأة (اختياري)
يتضمّن التطبيق الأوّلي وحدة إعلانات فيديو مقابل مكافأة مخصّصة لتوفير الراحة لك. يمكنك تخطّي هذه الخطوة تمامًا إذا كنت لا تريد إنشاء حساب جديد ضمن حسابك على AdMob.
خطوات الإعداد على أجهزة Android
لإنشاء تطبيق يستخدم AdMob جديد في حسابك، يُرجى اتّباع التعليمات التالية:
- انتقِل إلى وحدة تحكّم AdMob.
- من قائمة التطبيقات، انقر على إضافة تطبيق.
- عندما يُطلب منك الإجابة عن السؤال "هل نشرت تطبيقك على Google Play أو App Store؟"، اختَر "لا".
- أطلِق على التطبيق اسم "اختبار الرسم الرائع"، واختَر "Android" كنظام أساسي، ثم انقر على "إضافة".
بعد إنشاء تطبيق يستخدم AdMob في حسابك، اتّبِع الخطوات الموضّحة أدناه لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.
- انقر على قائمة التطبيقات في الواجهة الأمامية لـ AdMob، ثمّ اختَر "Awesome Drawing Quiz" من قائمة التطبيقات.
- انقر على قائمة الوحدات الإعلانية، ثمّ انقر على إضافة وحدة إعلانية لإنشاء وحدة إعلانية جديدة لإعلانات الفيديو بمكافأة.
- اختَر مقابل مكافأة لشكل الإعلان.

- أدخِل اسم الوحدة الإعلانية الذي تفضّله. بعد ذلك، اضبط مقدار المكافأة على 1 وعنصر المكافأة على "تلميح" (هذه هي المكافأة التي يقدّمها التطبيق حاليًا للمستخدمين). انقر على إنشاء وحدة إعلانية لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.

- عند إنشاء الحساب بنجاح، ستظهر لك التعليمات على النحو التالي.

- ارجع إلى مشروع Unity، وعدِّل ثوابت رقم تعريف تطبيق يستخدم AdMob ورقم تعريف الوحدة الإعلانية إلى الأرقام التي أنشأتها في الخطوة السابقة.
Ads/AdManager.cs
namespace AwesomeDrawingQuiz.Ads {
public class AdManager {
public const string APP_ID_ANDROID = "YOUR_ADMOB_APP_ID";
...
#elif UNITY_ANDROID
private const string APP_ID = APP_ID_ANDROID;
public const string AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";
...
}
}
إعدادات أجهزة iOS
لإنشاء تطبيق يستخدم AdMob جديد في حسابك، يُرجى اتّباع التعليمات التالية:
- انتقِل إلى وحدة تحكّم AdMob.
- من قائمة التطبيقات، انقر على إضافة تطبيق.
- عندما يُطلب منك الإجابة عن السؤال "هل نشرت تطبيقك على Google Play أو App Store؟"، اختَر "لا".
- أدخِل اسم التطبيق "Awesome Drawing Quiz"، واختَر "iOS" كنظام التشغيل، ثم انقر على "إضافة".
بعد إنشاء تطبيق يستخدم AdMob في حسابك، اتّبِع الخطوات الموضّحة أدناه لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.
- انقر على قائمة التطبيقات في الواجهة الأمامية لـ AdMob، ثمّ اختَر "Awesome Drawing Quiz" من قائمة التطبيقات.
- انقر على قائمة الوحدات الإعلانية، ثمّ انقر على إضافة وحدة إعلانية لإنشاء وحدة إعلانية جديدة لإعلانات الفيديو بمكافأة.
- اختَر مقابل مكافأة لشكل الإعلان.

- أدخِل اسم الوحدة الإعلانية الذي تفضّله. بعد ذلك، اضبط مقدار المكافأة على 1 وعنصر المكافأة على "تلميح" (هذه هي المكافأة التي يقدّمها التطبيق حاليًا للمستخدمين). انقر على إنشاء وحدة إعلانية لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.

- عند إنشاء الحساب بنجاح، ستظهر لك التعليمات على النحو التالي.

- ارجع إلى مشروع Unity، وعدِّل ثوابت رقم تعريف تطبيق يستخدم AdMob ورقم تعريف الوحدة الإعلانية إلى الأرقام التي أنشأتها في الخطوة السابقة.
Ads/AdManager.cs
namespace AwesomeDrawingQuiz.Ads {
public class AdManager {
public const string APP_ID_IOS = "YOUR_ADMOB_APP_ID";
...
#elif UNITY_IOS
private const string APP_ID = APP_ID_IOS;
public const string AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";
...
}
}
4. إضافة مكوّن Google Mobile Ads Unity الإضافي
استيراد المكوّن الإضافي
لعرض إعلانات AdMob على تطبيق Unity، عليك إضافة المكوّن الإضافي Google Mobile Ads Unity إلى المشروع.
- نزِّل حزمة المكوّن الإضافي لخدمة "إعلانات Google على الأجهزة الجوّالة" في Unity 3.18.1. (يُرجى العلم أنّ هذا الدرس التطبيقي حول الترميز قد لا يكون متوافقًا مع الإصدار الآخر من المكوّن الإضافي)
- في مشروع Unity اختبار الرسم الرائع في المشروع، انتقِل إلى الأصول (Assets) > استيراد الحزمة (Import Package) > حزمة مخصّصة (Custom Package).
- استورِد GoogleMobileAds.unitypackage إلى المشروع الذي نزّلته.
ضبط رقم تعريف تطبيق يستخدم AdMob
في "محرّر Unity"، اختَر مواد العرض (Assets) > "إعلانات Google على الأجهزة الجوّالة" (Google Mobile Ads) > الإعدادات (Settings) من القائمة.

فعِّل AdMob من خلال النقر على مربّع الاختيار مفعَّل ضمن قسم Google AdMob. بعد ذلك، أدخِل معرّف تطبيق AdMob على النحو التالي:
- نظام تشغيل Android:
ca-app-pub-3940256099942544~3048611032 - نظام تشغيل iOS:
ca-app-pub-3940256099942544~2753522596

5- إعداد مشروع Firebase
إنشاء مشروع جديد من "وحدة تحكّم Firebase"
- انتقِل إلى وحدة تحكّم Firebase.
- انقر على إضافة مشروع، وأطلِق على مشروعك اسم "اختبار الرسم الرائع".
إضافة تطبيق Unity
- من شاشة النظرة العامة لمشروعك الجديد، انقر على إضافة Firebase إلى تطبيق Unity.
- ضَع علامة في مربّع الاختيار "التسجيل كتطبيق iOS".
- أدخِل معرّف حزمة iOS على النحو التالي: com.codelab.awesomedrawingquiz.unity
- قدِّم اسمًا مستعارًا للتطبيق على النحو التالي: Awesome Drawing Quiz (Unity on iOS)
- ضَع علامة في مربّع الاختيار "التسجيل كتطبيق Android".
- أدخِل اسم حزمة Android على النحو التالي: com.codelab.awesomedrawingquiz.unity
- قدِّم اسمًا مستعارًا للتطبيق على النحو التالي: Awesome Drawing Quiz (Unity على Android)
- انقر على تسجيل التطبيق لتسجيل كلّ من تطبيقات Android وiOS.
إضافة ملفات إعداد Firebase إلى مشروع Unity
بعد ذلك، ستظهر لك شاشة يمكنك من خلالها تنزيل ملف إعداد يحتوي على جميع البيانات الوصفية اللازمة في Firebase لتطبيقك. نزِّل ملف google-service.json وملف GoogleService-Info.plist، ثم انقلهما إلى مجلد
Assets في مشروع Unity.

إضافة حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase"
- نزِّل حزمة Firebase Unity SDK 5.5.0 وفكّ ضغطها في مكان مناسب.
- افتح مشروع Unity اختبار الرسم الرائع، وانتقِل إلى الأصول (Assets) > استيراد الحزمة (Import Package) > الحزمة المخصّصة (Custom Package).
- من حزمة SDK التي تم فك ضغطها، استورِد حزمة SDK لميزة "الإعداد عن بُعد" (
dotnet4/FirebaseAnalytics.unitypackage). - في نافذة "استيراد حزمة Unity"، انقر على استيراد.
6. ربط حساب AdMob بمشروع على Firebase
أكمِل الخطوات التالية لربط تطبيقاتك بمنصة Firebase.
- سجِّل الدخول إلى حسابك على AdMob على https://apps.admob.com.
- انقر على "التطبيقات" في الشريط الجانبي.
- انقر على "اختبار الرسم الرائع". إذا لم يظهر الاسم في قائمة التطبيقات الأخيرة، يمكنك النقر على "عرض كل التطبيقات" للبحث في قائمة تتضمّن جميع التطبيقات التي أضفتها إلى AdMob.
- انقر على "إعدادات التطبيق" في الشريط الجانبي.
- انقر على "الربط بمنصّة Firebase".
- اختَر الخيار "الربط بمشروع حالي في Firebase وإنشاء تطبيق جديد في Firebase". بعد ذلك، اختَر مشروع "اختبار الرسم الرائع" من القائمة المنسدلة.
- بعد النقر على الزر "متابعة"، ستظهر لك الرسالة "تم الربط بنجاح". انقر على الزر "تم" لإنهاء العملية.
بعد ربط تطبيقك على AdMob بمشروع Firebase، ستتمكّن من الاستفادة من بعض الميزات الإضافية على كلّ من AdMob و"وحدة تحكّم Firebase" على النحو التالي:
بطاقة الإيرادات (AdMob)
من بطاقة "الأرباح"، يمكنك إلقاء نظرة شاملة على جميع مصادر الأرباح المحتملة في مكان واحد. في ما يلي مصادر الأرباح المتوافقة:
- AdMob (تقديرية)
- شبكات الإعلانات المستندة إلى التوسّط (التي تم رصدها)
- عمليات شراء داخل التطبيق
- عمليات الشراء من خلال التجارة الإلكترونية

بطاقة مقاييس المستخدم (AdMob)
من بطاقة مقاييس المستخدم، يمكنك الاطّلاع على كيفية تأثير التغييرات في تجربة الإعلانات على سلوك المستخدم.

تقرير "الإعلانات مقابل مكافأة" (AdMob)
يقدّم "تقرير الإعلانات مقابل مكافآت" مجموعة متنوّعة من المقاييس التي ستساعد الناشرين في فهم كيفية تفاعل المستخدمين مع إعلاناتهم مقابل مكافآت.

بطاقة إجمالي الأرباح (Firebase)
بعد ربط تطبيقك على AdMob بمنصة Firebase، ستعرض بطاقة "إجمالي الإيرادات" في لوحة بيانات Firebase الإيرادات من AdMob بالإضافة إلى عمليات الشراء داخل التطبيق وعمليات الشراء من خلال التجارة الإلكترونية.

إعداد تقارير عن أحداث الإعلانات (Firebase)
يتم جمع الأحداث الخاصة بالإعلانات (أحداث النقر والانطباع وأحداث مقابل مكافأة) تلقائيًا وتكون متاحة للاستخدام في "إحصاءات Google لـ Firebase".

7. تشغيل المشروع
بعد تجميع المشروع وتشغيله، ستظهر لك الشاشة التالية عند بدء تشغيل التطبيق.

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

إذا لم يكن لديك أي فكرة عن اسم الرسم، يمكنك تخطّي المستوى من خلال النقر على الزر "تخطّي".
قد تحتاج إلى دليل إضافي يساعدك في تخمين الإجابة. يمكنك الحصول على تلميح إضافي من خلال النقر على زر "تلميح" ومشاهدة إعلان فيديو مقابل مكافأة. بعد إكمال مشاهدة الإعلان، سيتم الكشف عن حرف إضافي كمكافأة.

8. إضافة أحداث التطبيقات
لفهم رحلة المستخدم في لعبة "اختبار الرسم الرائع" بشكلٍ مفصّل، عليك تحديد بعض الأحداث المخصّصة التي تتتبّع سلوك المستخدم في اللعبة على النحو التالي:
اسم الحدث | تم التفعيل... | المعلّمات |
game_start | عندما يبدأ المستخدم لعبة جديدة | لا ينطبق |
level_start | عندما يبدأ المستخدم مستوى جديدًا (اختبار رسم جديدًا) ضمن مرحلة (هناك 6 مستويات في مرحلة واحدة) | level_name |
level_wrong_answer | عندما يرسل المستخدم إجابة خاطئة | level_name |
ad_reward_prompt | عندما ينقر المستخدم على زر التلميح ويُطلب منه مشاهدة "إعلان فيديو مقابل مكافأة" | ad_unit_id |
ad_reward_impression | عندما يبدأ المستخدم بمشاهدة "إعلان فيديو مقابل مكافأة" | ad_unit_id |
level_success | عندما يقدّم المستخدم إجابة صحيحة (يجتاز مستوى) | level_name, number_of_attempts, elapsed_time_sec, hint_used |
level_fail | عندما يتخطّى المستخدم مستوى | level_name, number_of_attempts, elapsed_time_sec, hint_used |
game_complete | عند انتهاء المباراة | number_of_correct_answers |
في ما يلي وصف لكل مَعلمة مرتبطة بكل حدث:
اسم الحدث | اسم المَعلمة | الوصف |
level_start | level_name | اسم الرسم الظاهر في المستوى (مثلاً، "موزة") |
level_wrong_answer | level_name | اسم الرسم الظاهر في المستوى (مثلاً، "موزة") |
ad_reward_prompt | ad_unit_id | معرّف وحدة إعلانية يُستخدَم لعرض "إعلان فيديو مقابل مكافأة" |
ad_reward_impression | ad_unit_id | معرّف وحدة إعلانية يُستخدَم لعرض "إعلان فيديو مقابل مكافأة" |
level_success | level_name | اسم الرسم الظاهر في المستوى (مثلاً، "موزة") |
level_success | number_of_attempts | عدد المحاولات التي تم إجراؤها لاجتياز مستوى |
level_success | elapsed_time_sec | الوقت المنقضي لإكمال مستوى معيّن، بالثواني |
level_success | hint_used | ما إذا كان المستخدم قد استعان بتلميح (شاهد "إعلان فيديو مقابل مكافأة") أم لا لاجتياز مستوى (1: استعان بتلميح / 0: اجتاز مستوى بدون تلميح) |
level_fail | level_name | اسم الرسم الظاهر في المستوى (مثلاً، "موزة") |
level_fail | number_of_attempts | عدد المحاولات التي تم إجراؤها لاجتياز مستوى |
level_fail | elapsed_time_sec | الوقت المنقضي لإكمال مستوى معيّن، بالثواني |
level_fail | hint_used | ما إذا كان المستخدم قد استعان بتلميح (شاهد "إعلان فيديو مقابل مكافأة") أم لا لاجتياز مستوى (1: استعان بتلميح / 0: اجتاز مستوى بدون تلميح) |
game_complete | number_of_correct_answers | عدد المستويات التي تم اجتيازها في اللعبة |
إنشاء فئة مساعدة لتسجيل الأحداث المخصّصة
لتسجيل حدث الإحصاءات بسهولة، عليك إنشاء فئة مساعدة لإدارة الأحداث المخصّصة.
أولاً، أنشئ مجلدًا جديدًا ضمن المجلد Assets/Scripts، وسمِّه Analytics. بعد ذلك، أنشئ نصًا برمجيًا جديدًا بلغة C# وسمِّه QuizAnalytics.cs ضمن المجلد Analytics.
أضِف الرمز أدناه إلى ملف QuizAnalytics.cs.
Analytics/QuizAnalytics.cs
using Firebase.Analytics;
namespace AwesomeDrawingQuiz.Analytics {
public class QuizAnalytics {
private const string EVENT_AD_REWARD_PROMPT = "ad_reward_prompt";
private const string EVENT_AD_REWARD_IMPRESSION = "ad_reward_impression";
private const string EVENT_LEVEL_FAIL = "level_fail";
private const string EVENT_LEVEL_SUCCESS = "level_success";
private const string EVENT_LEVEL_WRONG_ANSWER = "level_wrong_answer";
private const string EVENT_GAME_START = "game_start";
private const string EVENT_GAME_COMPLETE = "game_complete";
private const string PARAM_AD_UNIT_ID = "ad_unit_id";
private const string PARAM_ELAPSED_TIME_SEC = "elapsed_time_sec";
private const string PARAM_HINT_USED = "hint_used";
private const string PARAM_NUMBER_OF_ATTEMPTS = "number_of_attempts";
private const string PARAM_NUMBER_OF_CORRECT_ANSWERS = "number_of_correct_answers";
public const string SCREEN_MAIN = "main";
public const string SCREEN_GAME = "game";
public static void LogGameStart() {
FirebaseAnalytics.LogEvent(EVENT_GAME_START);
}
public static void LogLevelStart(string levelName) {
FirebaseAnalytics.LogEvent(FirebaseAnalytics.EventLevelStart,
FirebaseAnalytics.ParameterLevelName, levelName);
}
public static void LogLevelWrongAnswer(string levelName) {
FirebaseAnalytics.LogEvent(EVENT_LEVEL_WRONG_ANSWER,
FirebaseAnalytics.ParameterLevelName, levelName);
}
public static void LogAdRewardPrompt(string adUnitId) {
FirebaseAnalytics.LogEvent(EVENT_AD_REWARD_PROMPT, PARAM_AD_UNIT_ID, adUnitId);
}
public static void LogAdRewardImpression(string adUnitId) {
FirebaseAnalytics.LogEvent(EVENT_AD_REWARD_IMPRESSION, PARAM_AD_UNIT_ID, adUnitId);
}
public static void LogLevelSuccess(
string levelName, int numberOfAttemps, int elapsedTimeInSec, bool hintUsed
) {
FirebaseAnalytics.LogEvent(EVENT_LEVEL_SUCCESS, new Parameter[] {
new Parameter(FirebaseAnalytics.ParameterLevelName, levelName),
new Parameter(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttemps),
new Parameter(PARAM_ELAPSED_TIME_SEC, elapsedTimeInSec),
new Parameter(PARAM_HINT_USED, hintUsed ? 1 : 0)
});
}
public static void LogLevelFail(
string levelName, int numberOfAttempts, int elapsedTimeInSec, bool hintUsed
) {
FirebaseAnalytics.LogEvent(EVENT_LEVEL_FAIL, new Parameter[] {
new Parameter(FirebaseAnalytics.ParameterLevelName, levelName),
new Parameter(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts),
new Parameter(PARAM_ELAPSED_TIME_SEC, elapsedTimeInSec),
new Parameter(PARAM_HINT_USED, hintUsed ? 1 : 0)
});
}
public static void LogGameComplete(int numberOfCorrectAnswers) {
FirebaseAnalytics.LogEvent(EVENT_GAME_COMPLETE,
PARAM_NUMBER_OF_CORRECT_ANSWERS, numberOfCorrectAnswers);
}
public static void SetScreenName(string screenName) {
FirebaseAnalytics.SetCurrentScreen(screenName, null);
}
}
}
تسجيل أحداث إحصاءات في اللعبة
افتح الملف Game.cs ضمن المجلد Assets/Scripts/Scenes. لاستخدام الفئة QuizAnalytics، التي تقع ضمن مساحة الاسم AwesomeDrawingQuiz.Analytics، أضِف توجيه الاستخدام على النحو التالي.
Scenes/Game.cs
using AwesomeDrawingQuiz.Ads;
// TODO: Import AwesomeDrawingQuiz.Analytics (101)
using AwesomeDrawingQuiz.Analytics;
...
namespace AwesomeDrawingQuiz.Scene {
...
}
بعد ذلك، في الدالة Start()، استدعِ الدالة QuizAnalytics.SetScreenName() لتغيير اسم الشاشة الحالية. يمكنك أيضًا الاتصال على الرقم QuizAnalytics.LogGameStart() للإشارة إلى بدء مباراة.
Scenes/Game.cs
void Start () {
// TODO: Log screen name (101)
QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_GAME);
...
SetHintButtonEnabled(false);
// TODO: Log game_start event (101)
QuizAnalytics.LogGameStart();
...
}
بعد ذلك، في دوال معاودة الاتصال، أضِف طلبات لتسجيل الأحداث المخصّصة على النحو التالي:
Scenes/Game.cs
public void OnClickHint() {
// TODO: Log ad_reward_prompt event (101)
QuizAnalytics.LogAdRewardPrompt(AdManager.AD_UNIT_ID);
...
}
...
public void OnAdStarted(object sender, EventArgs args) {
// TODO: Log ad_reward_impression event (101)
QuizAnalytics.LogAdRewardImpression(AdManager.AD_UNIT_ID);
}
...
public void OnGameOver(object sender, GameOverEventArgs args) {
// TODO: Log game_complete event (101)
QuizAnalytics.LogGameComplete(args.NumCorrectAnswers);
...
}
public void OnLevelCleared(object sender, LevelClearEventArgs args) {
// TODO: Log level_success event (101)
QuizAnalytics.LogLevelSuccess(
args.Drawing.word, args.NumAttempts, args.ElapsedTimeInSeconds, args.IsHintUsed);
...
}
public void OnLevelSkipped(object sender, LevelSkipEventArgs args) {
// TODO: Log level_fail event (101)
QuizAnalytics.LogLevelFail(
args.Drawing.word, args.NumAttempts, args.ElapsedTimeInSeconds, args.IsHintUsed);
}
public void OnNewLevel(object sender, NewLevelEventArgs args) {
// TODO: Log level_start event (101)
QuizAnalytics.LogLevelStart(args.Drawing.word);
...
}
public void OnWrongAnwser(object sender, WrongAnswerEventArgs args) {
// TODO: Log level_wrong_answer event (101)
QuizAnalytics.LogLevelWrongAnswer(args.Drawing.word);
...
}
أخيرًا، عدِّل ملف Main.cs ضمن المجلد Assets/Scripts/Scenes. عليك التأكّد من أنّ Firebase جاهز قبل طلب أي طرق في حزمة تطوير البرامج (SDK) لنظام Firebase.
Scenes/Main.cs
using AwesomeDrawingQuiz.Ads;
// TODO: Import AwesomeDrawingQuiz.Analytics (101)
using AwesomeDrawingQuiz.Analytics;
...
namespace AwesomeDrawingQuiz.Scene {
public class Main : MonoBehaviour {
...
void Start () {
Screen.sleepTimeout = SleepTimeout.SystemSetting;
#if UNITY_ANDROID
// Disable 'Start a game' button until
// Firebase dependencies are ready to use on the Android
buttonStartGame.interactable = false;
// TODO: Check Google Play Services on Android (101)
// Check Google Play Services on Android device is up to date
Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
var dependencyStatus = task.Result;
if (dependencyStatus == Firebase.DependencyStatus.Available) {
Debug.Log("All Firebase services are available");
// TODO: Set screen name (101)
QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_MAIN);
} else {
throw new System.InvalidOperationException(System.String.Format(
"Could not resolve all Firebase dependencies: {0}", dependencyStatus));
}
}).ContinueWith(task => {
// Enable 'Start a game' button
UnityMainThreadDispatcher.Instance()
.Enqueue(() => buttonStartGame.interactable = true);
});
#else
// TODO: Set screen name (101)
QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_MAIN);
#endif
}
...
}
}
9- تصحيح أخطاء أحداث "إحصاءات Google"
يمكنك استخدام DebugView للتأكّد من تسجيل الأحداث بشكلٍ صحيح. تتيح لك أداة DebugView الاطّلاع على بيانات الأحداث الأولية التي يسجّلها تطبيقك على أجهزة التطوير في الوقت الفعلي تقريبًا.
وهذا مفيد جدًا لأغراض التحقّق من الصحة خلال مرحلة قياس حالة التطبيق في عملية التطوير، ويمكن أن يساعدك في رصد الأخطاء في عملية تنفيذ "إحصاءات Google".
تفعيل وضع تصحيح الأخطاء على Android
بشكل عام، يتم تجميع الأحداث المسجَّلة في تطبيقك معًا على مدار فترة زمنية تبلغ ساعة واحدة تقريبًا، ثم يتم تحميلها معًا. للتحقّق من صحة تنفيذ "إحصاءات Google" أثناء التنفيذ، عليك تفعيل "وضع تصحيح الأخطاء" على جهاز التطوير لتحميل الأحداث بأقل تأخير.
أولاً، افتح أداة Terminal في استوديو Android. يظهر في شريط الأدوات أسفل الشاشة.

بعد ذلك، نفِّذ الأمر التالي (تأكَّد من توصيل جهاز Android التجريبي بجهاز الكمبيوتر أو تشغيل "محاكي Android"):
adb shell setprop debug.firebase.analytics.app com.google.codelab.awesomedrawingquiz
يستمر أسلوب الأداء هذا إلى أن يتم إيقاف "وضع تصحيح الأخطاء" بشكل صريح عن طريق تنفيذ الأمر التالي:
adb shell setprop debug.firebase.analytics.app .none.
تفعيل وضع تصحيح الأخطاء على أجهزة iOS
لتفعيل وضع تصحيح الأخطاء في "إحصاءات Google" على جهاز التطوير، حدِّد وسيطة سطر الأوامر التالية في Xcode:
-FIRDebugEnabled
يستمر أسلوب الأداء هذا إلى أن يتم إيقاف وضع تصحيح الأخطاء بشكل صريح عن طريق تحديد وسيطة سطر الأوامر التالية:
-FIRDebugDisabled
تصحيح أخطاء أحداث "إحصاءات Google" باستخدام DebugView
بعد تفعيل "وضع تصحيح الأخطاء" على جهاز الاختبار، انتقِل إلى وحدة تحكّم Firebase واختَر DebugView من القائمة. بعد ذلك، شغِّل لعبتك على جهازك الاختباري للاطّلاع على الأحداث التي يتم تسجيلها وعرضها في تقرير DebugView.

يمكنك الوصول إلى معلومات تفصيلية عن كل حدث من خلال النقر على اسم الحدث. على سبيل المثال، تعرض لقطة الشاشة التالية تفاصيل المَعلمات المرتبطة بالحدث level_start.

يُرجى الرجوع إلى مقالة مركز المساعدة حول DebugView لمزيد من التفاصيل.
10. تفعيل ميزة إعداد التقارير عن المَعلمات
ستجمع أداة "إحصاءات Google لبرنامج Firebase" إجمالي عدد مرات تسجيل الأحداث تلقائيًا، ولكن يجب تفعيل إعداد التقارير للمعلمات المخصّصة بشكلٍ صريح لكل مَعلمة خاصة بالحدث تهمّك. بعد تفعيل هذا الخيار، ستعرض "إحصاءات Google لبرنامج Firebase" بطاقات إضافية لعرض إحصاءات المَعلمات المخصّصة.
لتسجيل المعلمات المخصّصة لأي حدث:
- انتقِل إلى وحدة تحكّم Firebase واختَر مشروع اختبار الرسم الرائع الذي أنشأته سابقًا.
- انقر على الأحداث من قائمة التنقّل.
- في صف الحدث الذي تريد تعديله، انقر على الرمز
> تعديل إعداد التقارير عن المعلَمات.

- في الحقل إدخال اسم معلّمة، أدخِل اسم المعلّمة التي تريد تسجيلها.
ملاحظة: إذا لم يتم العثور على أي نتائج مطابقة، ما عليك سوى إدخال اسم المَعلمة ثم النقر على إضافة.
5. راجِع الجدول أدناه، واضبط حقل النوع على نص أو رقم وفقًا لذلك. في المعلَمات الرقمية، احرص على تحديد الحقل وحدة القياس أيضًا. 6. انقر على الزرّ حفظ لإنهاء عملية الإعداد.
فعِّل إعداد تقارير المَعلمات لكل حدث مُدرَج أدناه.
اسم الحدث | اسم المَعلمة | نوع المَعلمة | وحدة القياس |
level_start | level_name | نص | لا ينطبق |
level_wrong_answer | level_name | نص | لا ينطبق |
level_success | level_name | نص | لا ينطبق |
level_success | number_of_attempts | العدد | خطة "الرزمة العادية" |
level_success | elapsed_time_sec | العدد | الثواني |
level_success | hint_used | العدد | خطة "الرزمة العادية" |
level_fail | level_name | نص | لا ينطبق |
level_fail | number_of_attempts | العدد | خطة "الرزمة العادية" |
level_fail | elapsed_time_sec | العدد | الثواني |
level_fail | hint_used | العدد | خطة "الرزمة العادية" |
game_complete | number_of_correct_answers | العدد | خطة "الرزمة العادية" |
يعرض المثال التالي إعداد تقارير المَعلمات المخصّصة للحدث level_success:

بعد إكمال عملية إعداد تقارير المَعلمات، ستتمكّن من الاطّلاع على المَعلمات المرتبطة بكل حدث تم تفعيل ميزة إعداد تقارير المَعلمات له.

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

وفقًا للقطة الشاشة أعلاه، يمكنك بسهولة معرفة أنّ الأفق يتضمّن أكبر عدد من الإجابات الخاطئة، ما يعني أنّه صعب على المستخدمين مقارنةً بالمستويات الأخرى.
باستخدام الإحصاءات التي حصلت عليها من هنا، يمكنك اتّخاذ قرار بعدم توفير مستويات صعبة للمستخدمين المبتدئين للحفاظ على معدّل احتفاظ مرتفع.
ما هو متوسط عدد المحاولات التي تم إجراؤها لاجتياز مستوى معيّن؟
في لعبة اختبار الرسم الرائع، يمكن للمستخدمين إرسال الإجابة عن كل مستوى بالقدر الذي يريدونه.
بما أنّك فعّلت إعداد التقارير عن المَعلمات في المَعلمة number_of_attempts ضمن الحدث level_success، يمكنك الاطّلاع على المقاييس التفصيلية لهذه المَعلمة.
انقر على الحدث level_success من تقرير الأحداث. في تقرير الحدث level_success، ابحث عن البطاقة number_of_attemps. سيظهر لك متوسط عدد المحاولات على تلك البطاقة على النحو التالي:

يمكنك استخدام الإحصاءات من هنا لتحسين صعوبة اللعبة في المتوسط. على سبيل المثال، إذا كان متوسط عدد المحاولات قريبًا جدًا من 1، يمكنك جعل اللعبة أكثر صعوبة.
هل حاول المستخدمون حلّ السؤال من خلال الحصول على تلميح، حتى لو لم يتمكّنوا من اجتياز مستوى في النهاية؟
عندما يقرّر المستخدم تخطّي مستوى معيّن، يتمّ تشغيل الحدث level_fail. يمكن أن تكون هناك أسباب عديدة لقرار المستخدم.
ومع ذلك، بما أنّ اللعبة يمكن أن تقدّم للمستخدم تلميحًا بعد مشاهدة "إعلان فيديو مقابل مكافأة"، من المهم معرفة ما إذا كان المستخدم قد حاول اجتياز المستوى بمساعدة التلميح على الأقل.
انقر على الحدث level_fail من تقرير الأحداث. في تقرير الحدث level_fail، ابحث عن البطاقة hint_used. سيظهر لك متوسط عدد مَعلمات الحدث hint_used. يُرجى العِلم أنّه عند استخدام تلميح، يتم ضبط القيمة على 1، بينما يتم ضبطها على 0 عند عدم استخدام تلميح.

إذا كانت الأرقام الواردة في بطاقة hint_used قريبة من 0، يشير ذلك إلى أنّ المكافأة (التلميح) ليست جذابة للمستخدمين. بالإضافة إلى ذلك، ستفوتك فرصة زيادة الإيرادات من "إعلانات الفيديو مقابل مكافأة".
لذلك، عليك التفكير في تقديم مكافأة أكثر فائدة للمستخدمين، حتى يتمكّنوا من التفاعل مع اللعبة بشكل أكبر، بالإضافة إلى زيادة الإيرادات من "إعلان فيديو مقابل مكافأة".
ما هو عدد المستويات التي تم اجتيازها في كل لعبة، في المتوسط؟
يبلغ إجمالي عدد المستويات في كل لعبة من "اختبار الرسم الرائع" 6 مستويات. بعد أن ينهي المستخدم ستة مستويات (بغض النظر عمّا إذا اجتاز كل مستوى أو أخفق فيه)، يتمّ تشغيل الحدث game_complete مع number_of_correct_answers كمَعلمة.
بما أنّ number_of_correct_answers يشير إلى عدد المستويات التي اجتازها المستخدم (قدّم إجابة صحيحة)، يمكنك العثور على الإجابة من خلال الاطّلاع على مقاييس المَعلمة number_of_correct_answers.
انقر على الحدث game_complete من تقرير الأحداث. في تقرير حدث game_complete، ابحث عن البطاقة number_of_correct_answers. سيظهر لك متوسط عدد مَعلمات الحدث number_of_correct_answers.

إذا كان متوسط عدد المستويات التي تم اجتيازها منخفضًا جدًا، عليك التفكير في إعادة ترتيب اللعبة لمساعدة المستخدمين على اجتياز مستوى معيّن، حتى يتمكّنوا من مواصلة اللعب بدون أن يفقدوا اهتمامهم.
12. أكملت الخطوات بنجاح
لقد أكملت الدرس التطبيقي حول الترميز بعنوان "الأساسيات: AdMob وFirebase" في Unity. يمكنك العثور على الرمز البرمجي المكتمل لهذا الدرس التطبيقي حول الترميز في المجلد
101-complete_and_102-base.
في الجزء التالي من الدرس التطبيقي حول الترميز AdMob+Firebase، ستتعلّم كيفية استخدام مسار إحالة المستخدمين إلى إجراء معيّن لتصوّر مسار أحداث التطبيق. سنتناول أيضًا كيفية استخدام ميزتَي "الإعداد عن بُعد" و"اختبار A/B" لتحسين قيمة المَعلمة في اللعبة بدون تحديث التطبيق.