AdMob+Firebase 101 Unity: الإعداد أساسيات "إحصاءات Google"

1. مقدمة

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

مع ذلك، فإنّ توفير تجربة إعلانات ممتازة ليس بالأمر السهل. قد تكون لديك أسئلة مثل: كم مرة يجب عرض هذه الإعلانات؟ أين ومتى يجب عرضها؟ ما هي الجائزة المطلوبة؟ تختلف الإجابة من تطبيق لآخر ومن موضع إعلان إلى آخر. ما مِن إجابة واحدة تناسب الجميع.

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

ما الذي ستنشئه

هذا الدرس التطبيقي هو الأول من بين ثلاثة دروس تطبيقية حول الترميز سترشدك خلال عملية إنشاء تطبيق يُسمى Awesome Drawing Quiz، وهو لعبة تتيح للّاعبين تخمين اسم الرسم. وسيوضّح ذلك كيفية دمج خدمات Firebase والإعلانات التي تضم مكافآت في لعبتك.

في هذا الدرس التطبيقي، ستتمكن من دمج "إحصاءات Google لبرنامج Firebase" من أجل تسجيل بعض أحداث التطبيق المهمة. وستتعرَّف أيضًا على كيفية قراءة إحصاءات التطبيقات المعروضة في وحدة تحكُّم Firebase.

المعلومات التي ستطّلع عليها

  • كيفية إعداد "إحصاءات Google لبرنامج Firebase" في تطبيقك
  • كيفية تسجيل الأحداث الخاصة بالتطبيقات
  • كيفية قراءة إحصاءات التطبيقات المعروضة في "وحدة تحكُّم Firebase"

المتطلبات

  • Unity 2018.4.4f1 أو إصدار أحدث
  • Xcode 10 أو أعلى (لإنشاء الهدف لنظام iOS)
  • حساب Google
  • جهاز اختباري يعمل بالإصدار 5.0 من نظام التشغيل Android أو الإصدارات الأحدث مع كابل USB لتوصيل جهازك، أو محاكي Android يعمل بنظام AVD(جهاز Android افتراضي) يتضمّن صورة نظام تتوافق مع "متجر Play" أو واجهات Google APIs
  • جهاز iOS أو جهاز محاكاة يعمل بنظام التشغيل iOS 8.0 أو إصدار أحدث

ما هو تقييمك لمستوى خبرتك في استخدام AdMob؟

حديث متوسط بارع

ما هو تقييمك لمستوى خبرتك في استخدام Firebase؟

حديث متوسط بارع

2. إعداد بيئة التطوير

تنزيل الرمز

انقر على الزر التالي لتنزيل جميع الرموز الخاصة بهذا الدرس التطبيقي حول الترميز:

فك ضغط ملف ZIP الذي تم تنزيله. سيؤدي هذا الإجراء إلى فك ضغط مجلد جذر باسم admob-firebase-codelabs-unity-master.

...أو استنساخ مستودع جيت هب من سطر الأوامر.

$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-unity

يحتوي المستودع على أربعة مجلدات على النحو التالي:

  • android_studio_folder.png101-base: بدء الرمز البرمجي الذي ستنشئه في هذا الدرس التطبيقي حول الترميز
  • android_studio_folder.png101-complete_and_102-base — تم إكمال الرمز لهذا الدرس التطبيقي حول الترميز، المبتدئين للدرس التطبيقي حول الترميز 102.
  • android_studio_folder.png102-complete: تم إكمال الرمز للدرس التطبيقي 102.

إعداد الملفات المطلوبة

يستخدم اختبار الرسم الرائع العديد من الرموز مفتوحة المصدر والمطلوبة لتجميع المشروع وتنفيذه.

افتح الوحدة الطرفية، وانتقِل إلى الدليل الجذري للمستودع. بعد ذلك، شغِّل ./gradlew :prepareThirdPartyFiles (gradlew.bat :prepareThirdPartyFiles على نظام التشغيل Windows) من الوحدة الطرفية لنسخ الملفات المطلوبة إلى المشروع.

استيراد تطبيق إجراء التفعيل

شغِّل Unity، واختَر "فتح" في شاشة الترحيب. بعد ذلك، اختَر دليل 101-base من الرمز الذي نزّلته.

من المفترض أن يكون المشروع مفتوحًا الآن في Unity.

3- إعداد وحدة إعلانات فيديو تضم مكافأة (اختياري)

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

الإعداد لجهاز Android

لإنشاء تطبيق AdMob جديد في حسابك، يُرجى اتباع التعليمات التالية:

  1. انتقِل إلى وحدة تحكُّم AdMob.
  2. من القائمة تطبيقات، انقر على إضافة تطبيق.
  3. عند طرح السؤال "هل نشرت تطبيقك على Google Play أو App Store"، يجب الإجابة بـ "لا".
  4. اختر اسمًا للتطبيق "Awesome Drawing Quiz," اختَر Android كنظام أساسي، ثم انقر على إضافة.

بعد إنشاء تطبيق AdMob في حسابك، اتّبِع الخطوات الموضّحة في ما يلي لإنشاء وحدة جديدة لإعلانات الفيديو التي تضم مكافأة.

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

7672f41ec611101b.png

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

6d067814a2c38264.png

  1. عند اكتمال عملية الإنشاء بنجاح، ستظهر لك التعليمات كما يلي:

4bc1b3b341a5a81c.png

  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 جديد في حسابك، يُرجى اتباع التعليمات التالية:

  1. انتقِل إلى وحدة تحكُّم AdMob.
  2. من القائمة تطبيقات، انقر على إضافة تطبيق.
  3. عند طرح السؤال "هل نشرت تطبيقك على Google Play أو App Store"، يجب الإجابة بـ "لا".
  4. اختر اسمًا للتطبيق "Awesome Drawing Quiz," اختر "iOS" كنظام أساسي، ثم انقر على "إضافة".

بعد إنشاء تطبيق AdMob في حسابك، اتّبِع الخطوات الموضّحة في ما يلي لإنشاء وحدة جديدة لإعلانات الفيديو التي تضم مكافأة.

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

7672f41ec611101b.png

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

6d067814a2c38264.png

  1. عند اكتمال عملية الإنشاء بنجاح، ستظهر لك التعليمات كما يلي:

4bc1b3b341a5a81c.png

  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. إضافة مكوّن Unity الإضافي لإعلانات Google على الأجهزة الجوّالة

استيراد المكوّن الإضافي

لعرض إعلانات AdMob على تطبيق Unity، يجب إدراج مكوّن Unity الإضافي لإعلانات Google على الأجهزة الجوّالة في المشروع.

  1. تنزيل حزمة الإصدار 3.18.1 من مكوّن Unity الإضافي لإعلانات Google على الأجهزة الجوّالة. (يُرجى ملاحظة أنّ هذا الدرس التطبيقي حول الترميز قد لا يتوافق مع الإصدار الآخر من المكوّن الإضافي)
  2. في مشروع Unity لاختبار الرسومات الرائعة. في المشروع، انتقِل إلى مواد العرض >. استيراد الحزمة > الحزمة المخصّصة
  3. استورِد GoogleMobileAds.unitypackage إلى المشروع الذي نزّلته.

ضبط رقم تعريف تطبيق AdMob

في محرِّر Unity، اختَر مواد العرض >. إعلانات Google للأجهزة الجوّالة > الإعدادات من القائمة.

44fc84fe88235c1f.png

فعِّل AdMob بالنقر على مربّع الاختيار مفعّل ضمن قسم Google AdMob. بعد ذلك، أدخِل رقم تعريف تطبيق AdMob على النحو التالي:

  • نظام تشغيل Android:‏ ca-app-pub-3940256099942544~3048611032
  • نظام تشغيل iOS:‏ ca-app-pub-3940256099942544~2753522596

a6ad7402d4daf330.png

5- إعداد مشروع Firebase

إنشاء مشروع جديد من "وحدة تحكُّم Firebase"

  1. انتقِل إلى وحدة تحكُّم Firebase.
  2. اختَر إضافة مشروع، وأدخِل اسمًا لمشروعك "اختبار رسومات رائعة".

إضافة تطبيق Unity

  1. من شاشة النظرة العامة على مشروعك الجديد، انقر على إضافة Firebase إلى تطبيق Unity.
  2. حدد مربع الاختيار "تسجيل كتطبيق iOS".
  3. أدخِل رقم تعريف حزمة iOS على النحو التالي: com.codelab.awesomedrawingquiz.unity.
  4. أدخِل لقب التطبيق باسم: Awesome Drawing Quiz (Unity on iOS)
  5. حدد مربع الاختيار "التسجيل باسم تطبيق Android".
  6. أدخِل اسم حزمة Android على النحو التالي: com.codelab.awesomedrawingquiz.unity
  7. أدخِل لقب التطبيق باسم: Awesome Drawing Quiz (Unity on Android)
  8. اختَر تسجيل التطبيق لتسجيل تطبيقات Android وiOS.

إضافة ملفات إعداد Firebase إلى مشروع Unity

بعد ذلك، ستظهر لك شاشة حيث يمكنك تنزيل ملف إعداد يحتوي على جميع بيانات Firebase الوصفية اللازمة لتطبيقك. نزِّل google-service.json والملف GoogleService-Info.plist، ثم انقلهما إلى مجلد android_studio_folder.pngAssets في مشروع Unity.

331c165d80ba105e.png

إضافة حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase"

  1. يمكنك تنزيل الإصدار 5.5.0 من حزمة تطوير البرامج (SDK) لمنصّة Firebase Unity وفكّ ضغطه في مكان مناسب.
  2. افتح مشروع Unity اختبار الرسومات الرائعة وانتقِل إلى مواد العرض >. استيراد الحزمة > الحزمة المخصّصة
  3. من حزمة تطوير البرامج (SDK) غير المضغوطة، استورِد حزمة تطوير البرامج (SDK) الخاصة بميزة "الإعداد عن بُعد" (dotnet4/FirebaseAnalytics.unitypackage).
  4. في نافذة "استيراد حزمة Unity"، انقر على استيراد.

6- ربط AdMob بمشروع Firebase

أكمِل الخطوات التالية لربط تطبيقاتك بمنصّة Firebase.

  1. سجِّل الدخول إلى حساب AdMob على https://apps.admob.com.
  2. انقر على "التطبيقات" في الشريط الجانبي.
  3. اختَر Awesome Drawing quiz. وفي حالة عدم رؤيته في قائمة التطبيقات المستخدمة مؤخرًا، يمكنك النقر على عرض كل التطبيقات للبحث في قائمة بجميع التطبيقات التي أضفتها إلى AdMob.
  4. انقر على "إعدادات التطبيق" في الشريط الجانبي.
  5. انقر على "الربط بمنصة Firebase".
  6. حدِّد الخيار "الربط بمشروع حالي على Firebase وإنشاء تطبيق جديد في Firebase". بعد ذلك، اختَر مشروع Awesome Drawing Quiz" (اختبار الرسم الرائع) من القائمة المنسدلة.
  7. بعد النقر على الزر متابعة، ستظهر لك رسالة "تم الربط بنجاح". انقر على الزر تم لإنهاء العملية.

بعد ربط تطبيقك على AdMob بمشروع Firebase، سيؤدّي ذلك إلى إتاحة بعض الميزات الإضافية على كلٍّ من وحدة تحكُّم AdMob وFirebase على النحو التالي:

بطاقة الأرباح (AdMob)

من بطاقة الأرباح، يمكنك إلقاء نظرة شاملة على جميع مصادر الأرباح المحتملة في مكان واحد. في ما يلي مصادر الأرباح المتوافقة:

  • AdMob (مقدَّر)
  • شبكات الإعلانات المعتمدة على التوسّط (مرصودة)
  • عمليات شراء داخل التطبيق
  • عمليات الشراء من خلال التجارة الإلكترونية

10fe118249e11150.png

بطاقة مقاييس سلوك المستخدِمين (AdMob)

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

5f56366f1b31d4a1.png

تقرير الإعلانات التي تضم مكافأة (AdMob)

يقدّم تقرير "الإعلانات التي تضم مكافأة" مجموعة متنوعة من المقاييس التي ستساعد الناشرين على فهم كيفية تفاعل المستخدمين مع الإعلانات التي تضم مكافأة.

658a2868777690ea.png

بطاقة إجمالي الأرباح (Firebase)

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

98cb283977b023a.png

إعداد تقارير أحداث الإعلانات (Firebase)

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

bf77bd8c00c1441b.png

7. تشغيل المشروع

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

f5fbf4565c5d8647.png

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

bbdf4d23fb08a519.png ad82d7e657945c4d.png

وإذا لم تكن لديك أي فكرة عن اسم الرسم، يمكنك تخطّي المستوى بالنقر على زر التخطّي.

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

8c33687361f83a13.png b048d6587c10e9df.png

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، وe فقدd_time_sec، وhint_used

level_fail

عندما يتخطى المستخدِم مستوى

level_name، وnumber_of_attempts، وe فقدd_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. أحداث الإحصاءات المتعلقة بتصحيح الأخطاء

يمكنك استخدام DebugView للتأكّد من صحة تسجيل الأحداث. ويتيح لك DebugView الاطّلاع على بيانات الأحداث الأولية التي سجّلها تطبيقك على أجهزة التطوير في الوقت الفعلي تقريبًا.

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

تفعيل وضع تصحيح الأخطاء على Android

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

أولاً، افتح "الأداة الطرفية" في "استوديو Android". وهي موجودة في شريط الأدوات السفلي.

c8dc1b4f08a224b8.png

بعد ذلك نفِّذ الأمر التالي (تأكد من توصيل جهاز 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.

827059255d09ac00.png

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

475db00d05d03ab8.png

يُرجى الرجوع إلى مقالة مركز مساعدة DebugView للحصول على مزيد من التفاصيل.

10. تفعيل إعداد التقارير عن المَعلمات

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

لتسجيل المعلمات المخصّصة لأي حدث:

  1. انتقِل إلى وحدة تحكُّم Firebase واختَر مشروع Awesome Drawing Quiz الذي أنشأته سابقًا.
  2. انقر على الأحداث من قائمة التنقّل.
  1. في صف الحدث الذي تريد تعديله، انقر على 73afe611adf58774.png> تعديل تقارير المَعلمات

aad40de06ee0c3ad.png

  1. في الحقل إدخال اسم معلّمة، أدخِل اسم المعلّمة التي تريد تسجيلها.

ملاحظة: إذا لم يتم العثور على أي مطابقة، ما عليك سوى إدخال اسم المَعلمة ثم النقر على إضافة.e066c761aae4797f.png 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):

6d569c8c27df2914.png

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

d1a37589d54bca6b.png

11. الحصول على إحصاءات من تقرير الأحداث

بعد إضافة بعض الأحداث في اللعبة، من المفترض أن يكون بإمكانك الإجابة عن الأسئلة المتعلّقة بسلوك المستخدمين في اللعبة. في ما يلي بعض الإحصاءات التي يمكنك الحصول عليها من تقرير أحداث Firebase.

ما المستوى الذي يحتوي على أكبر عدد من الإجابات الخاطئة؟

للإجابة عن هذا السؤال، عليك معرفة عدد أحداث "level_wrong_answer" التي تم تشغيلها لكل مستوى.

انقر على level_wrong_answer من تقرير الأحداث. في تقرير أحداث "level_wrong_answer"، ابحث عن بطاقة "level_name". وستظهر القيم المرتبطة بالمَعلمة level_name في تلك البطاقة على النحو التالي.

25da426bbc0c612c.png

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

بفضل المعلومات التي حصلت عليها من هنا، يمكنك أن تقرر عدم توفير مستويات صعبة للمستخدمين المبتدئين للحفاظ على معدل احتفاظ مرتفع.

ما هو متوسط عدد المحاولات التي تم إجراؤها لمحو مستوى معيَّن؟

في اختبار الرسم الرائع، يمكن للمستخدمين إرسال الإجابة عن كل مستوى بقدر ما يريدون.

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

انقر على الحدث level_success من تقرير الأحداث. في تقرير أحداث "level_success"، ابحث عن بطاقة "number_of_attemps". سيظهر متوسط عدد المحاولات على هذه البطاقة على النحو التالي:

43de290f9f1a0ac9.png

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

هل حاول المستخدمون حلّ السؤال من خلال الحصول على تلميح، حتى إذا تعذّر عليهم إكمال أحد المستويات في النهاية؟

عندما يقرِّر المستخدِم تخطي أحد المستويات، يتمّ بدء حدث level_fail. قد تكون هناك أسباب عديدة لقرار المستخدم.

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

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

313814372cd7c8a4.png

وإذا اقتربت الأرقام في بطاقة 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.

d9eeaa019d1bceb4.png

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

12. أكملت كل الإجراءات

لقد أكملت الدرس التطبيقي حول ترميز Unity بين AdMob وFirebase 101. يمكنك العثور على الرمز المكتمل لهذا الدرس التطبيقي في المجلد android_studio_folder.png101-complete_and_102-base.

في الجزء التالي من الدرس التطبيقي حول الترميز بين AdMob وFirebase، ستتعرّف على كيفية استخدام مسار إحالة ناجحة لعرض تدفق أحداث التطبيق. وستتناول أيضًا كيفية استخدام ميزتَي "الإعداد عن بُعد" و"اختبار A/B" لتحسين قيمة المَعلمة في اللعبة بدون تحديث التطبيق.