AdMob+Firebase 101 Unity: 설정 & 애널리틱스 기본사항

1. 소개

광고는 앱의 전반적인 사용자 환경에서 매우 중요한 부분입니다. 효과적인 광고 구현은 전반적인 앱 경험을 개선하고 사용자 유지율과 참여도를 높이는 데 도움이 됩니다. 예를 들어 보상형 광고를 사용하면 동영상 광고를 시청한 사용자에게 인앱 화폐나 아이템을 리워드로 제공할 수 있으므로, 그렇지 않으면 사용자가 어려움을 겪고 이탈할 가능성이 있는 새로운 수준에 도달할 수 있습니다.

하지만 우수한 광고 경험을 만들기란 쉽지 않습니다. 이러한 광고를 얼마나 자주 게재해야 하는지 등을 궁금해할 수 있습니다. 광고를 언제, 어디에 게재해야 할까요? 어떤 어워즈를 수상해야 할까요? 아쉽게도 답은 앱마다, 그리고 게재위치에 따라 다릅니다. 천편일률적으로 적용되는 답은 없습니다.

Firebase용 Google 애널리틱스, AdMob, 그리고 Firebase에서 제공하는 강력하고 사용하기 쉬운 여러 가지 도구를 통해 데이터 기반 방식으로 앱을 훨씬 더 쉽고 간소화할 수 있게 되었습니다. 오늘은 그 방법을 알아보겠습니다.

빌드할 항목

이 Codelab은 플레이어가 그림의 이름을 추측할 수 있는 게임인 Awesome Drawing Quiz라는 앱을 빌드하는 방법을 설명하는 세 가지 Codelab 중 첫 번째 Codelab입니다. 보상형 광고와 Firebase 서비스를 게임에 통합하는 방법을 설명합니다.

이 Codelab에서는 Firebase용 Google 애널리틱스를 통합하여 몇 가지 중요한 앱 이벤트를 기록합니다. 또한 Firebase Console에 표시되는 앱 애널리틱스를 읽는 방법을 알아봅니다.

학습할 내용

  • 앱에서 Firebase용 Google 애널리틱스를 설정하는 방법
  • 앱 이벤트를 기록하는 방법
  • Firebase Console에 표시된 앱 애널리틱스를 읽는 방법

필요한 항목

  • Unity 2018.4.4f1 이상
  • Xcode 10 이상 (iOS용 타겟 빌드용)
  • Google 계정
  • Android 5.0 이상을 실행하는 테스트 기기(USB 케이블 포함) 또는 Play 스토어/Google API를 지원하는 시스템 이미지로 AVD(Android Virtual Device)를 실행하는 Android Emulator
  • iOS 8.0 이상을 실행하는 iOS 기기 또는 시뮬레이터

AdMob 사용 경험 수준을 평가해 주세요.

초급 중급 고급

Firebase 사용 경험 수준을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 개발 환경 설정

코드 다운로드

다음 버튼을 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

다운로드한 ZIP 파일의 압축을 해제합니다. 이렇게 하면 admob-firebase-codelabs-unity-master라는 루트 폴더가 압축 해제됩니다.

...또는 명령줄에서 GitHub 저장소를 클론합니다.

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

저장소에는 다음과 같은 4개의 폴더가 포함됩니다.

  • android_studio_folder.png기초 — 이 Codelab에서 빌드할 시작 코드입니다.
  • android_studio_folder.png101-complete_and_102-base — 이 Codelab 및 102 Codelab의 시작 조건을 정의합니다.
  • android_studio_folder.png102-complete — 102 Codelab을 위해 완료된 코드입니다.

필수 파일 준비

Awesome Drawing Quiz는 프로젝트를 컴파일하고 실행하는 데 필요한 여러 오픈소스 코드를 사용합니다.

터미널을 열고 저장소 루트 디렉터리로 이동합니다. 그런 다음 터미널에서 ./gradlew :prepareThirdPartyFiles (Windows의 경우 gradlew.bat :prepareThirdPartyFiles)를 실행하여 필요한 파일을 프로젝트에 복사합니다.

시작 앱 가져오기

Unity를 실행하고 시작 화면에서 'Open'을 선택합니다. 그런 다음 다운로드한 코드에서 101-base 디렉터리를 선택합니다.

이제 Unity에서 프로젝트가 열립니다.

3. 보상형 동영상 광고 단위 설정 (선택사항)

시작 앱에는 이미 편의를 위해 전용 보상형 동영상 광고 단위가 포함되어 있습니다. AdMob 계정에서 새 계정을 만들지 않으려면 이 단계를 건너뛰어도 됩니다.

Android 설정

계정에서 새 AdMob 앱을 만들려면 다음 안내를 따르세요.

  1. AdMob 콘솔로 이동합니다.
  2. 메뉴에서 '앱 추가'를 클릭합니다.
  3. '앱을 Google Play 또는 App Store에 게시하셨나요?'라는 메시지가 표시되면 아니요'라고 답합니다.
  4. 앱 이름을 'Awesome Drawing Quiz'로 지정합니다. 플랫폼으로 'Android'를 선택한 다음 'Add'(추가)를 클릭합니다.

계정에서 AdMob 앱을 만든 후 아래 설명된 단계에 따라 새로운 보상형 동영상 광고 단위를 만드세요.

  1. AdMob 프런트엔드에서 메뉴를 클릭한 다음 앱 목록에서 'Awesome Drawing Quiz'를 선택합니다.
  2. 광고 단위 메뉴를 클릭한 다음 광고 단위 추가를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.
  3. 광고 형식으로 보상형을 선택합니다.

7672f41ec611101b.png

  1. 원하는 광고 단위의 이름을 입력합니다. 그런 다음 보상 수량을 1로 설정하고 보상 아이템을 "hint" (앱에서 현재 사용자에게 제공하는 보상)로 설정합니다. 광고 단위 만들기를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.

6d067814a2c38264.png

  1. 성공적으로 생성되면 다음과 같은 안내가 표시됩니다.

4bc1b3b341a5a81c.png

  1. Unity 프로젝트로 돌아가서 AdMob 앱 ID 및 광고 단위 ID 상수를 이전 단계에서 만든 상수로 업데이트합니다.

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 프런트엔드에서 메뉴를 클릭한 다음 앱 목록에서 'Awesome Drawing Quiz'를 선택합니다.
  2. 광고 단위 메뉴를 클릭한 다음 광고 단위 추가를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.
  3. 광고 형식으로 보상형을 선택합니다.

7672f41ec611101b.png

  1. 원하는 광고 단위의 이름을 입력합니다. 그런 다음 보상 수량을 1로 설정하고 보상 아이템을 "hint" (앱에서 현재 사용자에게 제공하는 보상)로 설정합니다. 광고 단위 만들기를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.

6d067814a2c38264.png

  1. 성공적으로 생성되면 다음과 같은 안내가 표시됩니다.

4bc1b3b341a5a81c.png

  1. Unity 프로젝트로 돌아가서 AdMob 앱 ID 및 광고 단위 ID 상수를 이전 단계에서 만든 상수로 업데이트합니다.

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 모바일 광고 Unity 플러그인 추가

플러그인 가져오기

Unity 앱에서 AdMob 광고를 게재하려면 프로젝트에 Google 모바일 광고 Unity 플러그인을 추가해야 합니다.

  1. Google 모바일 광고 Unity 플러그인 3.18.1 패키지를 다운로드합니다. (이 Codelab은 다른 버전의 플러그인과 호환되지 않을 수 있음)
  2. Awesome Drawing Quiz Unity 프로젝트 프로젝트에서 애셋 > 패키지 가져오기 > Custom Package를 사용합니다.
  3. 다운로드한 프로젝트로 GoogleMobileAds.unitypackage를 가져옵니다.

AdMob 앱 ID 구성

Unity 편집기에서 Assets(애셋) > Assets(애셋) > Google 모바일 광고 > 설정을 선택합니다.

44fc84fe88235c1f.png

Google AdMob 섹션에서 사용 설정됨 체크박스를 클릭하여 AdMob을 사용 설정합니다. 그런 다음 아래와 같이 AdMob 앱 ID를 입력합니다.

  • Android: ca-app-pub-3940256099942544~3048611032
  • iOS: ca-app-pub-3940256099942544~2753522596

a6ad7402d4daf330.png

5. Firebase 프로젝트 설정

Firebase Console에서 새 프로젝트 만들기

  1. Firebase Console로 이동합니다.
  2. 프로젝트 추가를 선택하고 프로젝트 이름을 'Awesome Drawing Quiz'로 지정합니다.

Unity 앱 추가

  1. 새 프로젝트의 개요 화면에서 Unity 앱에 Firebase 추가를 클릭합니다.
  2. iOS 앱으로 등록 체크박스를 선택합니다.
  3. iOS 번들 ID를 다음과 같이 입력합니다. com.codelab.awesomedrawingquiz.unity
  4. Awesome Drawing Quiz (iOS의 Unity)와 같이 앱 닉네임을 제공합니다.
  5. Android 앱으로 등록 체크박스를 선택합니다.
  6. Android 패키지 이름을 com.codelab.awesomedrawingquiz.unity와 같이 입력합니다.
  7. 앱 닉네임을 Awesome Drawing Quiz (Android의 Unity)로 제공합니다.
  8. Android 앱과 iOS 앱을 모두 등록하려면 앱 등록을 선택합니다.

Unity 프로젝트에 Firebase 구성 파일 추가

그러면 앱에 필요한 모든 Firebase 메타데이터가 포함된 구성 파일을 다운로드할 수 있는 화면이 표시됩니다. google-service.jsonGoogleService-Info.plist 파일을 다운로드한 후 두 파일을 모두 Unity 프로젝트의 android_studio_folder.pngAssets 폴더로 옮깁니다.

331c165d80ba105e.png

Firebase 애널리틱스 SDK 추가

  1. Firebase Unity SDK 5.5.0을 다운로드하고 편리한 위치에 압축을 풉니다.
  2. Awesome Drawing Quiz Unity 프로젝트를 열고 애셋 > 애셋으로 이동합니다. 패키지 가져오기 > Custom Package를 사용합니다.
  3. 압축을 푼 SDK에서 원격 구성 SDK (dotnet4/FirebaseAnalytics.unitypackage)를 가져옵니다.
  4. Unity 패키지 가져오기 창에서 가져오기를 클릭합니다.

6. Firebase 프로젝트에 AdMob 연결

앱을 Firebase에 연결하려면 아래 단계를 완료하세요.

  1. https://apps.admob.com에서 AdMob 계정에 로그인합니다.
  2. 사이드바에서 앱을 클릭합니다.
  3. 'Awesome Drawing Quiz'를 선택합니다. 최근 앱 목록에 이 앱이 표시되지 않으면 모든 앱 보기를 클릭하여 AdMob에 추가한 모든 앱의 목록을 검색할 수 있습니다.
  4. 사이드바에서 '앱 설정'을 클릭합니다.
  5. 'Firebase에 연결'을 클릭합니다.
  6. '기존 Firebase 프로젝트에 연결하고 새 Firebase 앱 만들기' 옵션을 선택합니다. 그런 다음 드롭다운 메뉴에서 'Awesome Drawing Quiz' 프로젝트를 선택합니다.
  7. '계속' 버튼을 클릭하면 '연결됨' 메시지가 표시됩니다. '완료' 버튼을 클릭하여 완료합니다.

AdMob 앱을 Firebase 프로젝트에 연결하면 AdMob 및 Firebase Console에서 다음과 같은 추가 기능이 제공됩니다.

수익 카드 (AdMob)

수익 카드에서 가능한 모든 수익원을 한 곳에서 전체적으로 살펴볼 수 있습니다. 지원되는 수익원은 다음과 같습니다.

  • AdMob (예상)
  • 미디에이션된 광고 네트워크 (관찰됨)
  • 인앱 구매
  • 전자상거래 구매

10fe118249e11150.png

사용자 측정항목 카드 (AdMob)

사용자 측정항목 카드에서 광고 경험 변경이 사용자 행동에 미칠 수 있는 영향을 확인할 수 있습니다.

5f56366f1b31d4a1.png

보상형 광고 보고서 (AdMob)

보상형 광고 보고서는 사용자가 보상형 광고와 상호작용하는 방식을 게시자가 이해하는 데 도움이 되는 다양한 측정항목을 제공합니다.

658a2868777690ea.png

총수익 카드 (Firebase)

AdMob 앱을 Firebase에 연결하면 Firebase 대시보드의 총수익 카드에 인앱 구매 및 전자상거래 구매와 함께 AdMob에서 발생한 수익이 표시됩니다.

98cb283977b023a.png

광고 이벤트 보고 (Firebase)

광고별 이벤트 (클릭, 노출, 리워드 이벤트)가 자동으로 수집되어 Firebase용 Google 애널리틱스에서 사용할 수 있습니다.

bf77bd8c00c1441b.png

7. 프로젝트 실행

프로젝트를 컴파일하고 실행하면 앱이 시작될 때 다음 화면이 표시됩니다.

f5fbf4565c5d8647.png

'게임 시작'을 클릭하면 화면에 그림이 표시됩니다. 여러분의 임무는 상단에 표시된 힌트를 사용하여 그림의 이름을 추측하는 것입니다. 힌트를 통해 그림 이름의 첫 글자와 길이를 추론할 수 있습니다.

bbdf4d23fb08a519.png ad82d7e657945c4d.png

그림의 이름이 무엇인지 모를 경우 ‘SKIP’ 버튼을 클릭하여 레벨을 건너뛸 수 있습니다.

답을 추측하는 데 도움이 되는 추가 단서가 필요할 수 있습니다. '힌트' 버튼을 클릭하고 보상형 동영상 광고를 시청하면 추가 단서를 얻을 수 있습니다. 광고 시청을 완료하면 리워드로 추가 글자 1개가 표시됩니다.

8c33687361f83a13.png b048d6587c10e9df.png

8. 앱 이벤트 추가

Awesome Drawing Quiz에서 사용자 여정을 심도 있게 이해하기 위해 다음과 같이 게임에서 사용자의 행동을 추적하는 맞춤 이벤트를 몇 가지 정의합니다.

이벤트 이름

트리거됨...

매개변수

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_fail

사용자가 레벨을 건너뛸 때

레벨_이름, 시도_횟수, 경과_시간_초, 힌트_사용됨

game_complete

게임이 끝났을 때

number_of_correct_answers

각 이벤트와 연결된 각 매개변수에 대한 설명은 다음과 같습니다.

이벤트 이름

매개변수 이름

설명

level_start

level_name

레벨에 표시되는 그림의 이름 (예: '바나나')

level_wrong_answer

level_name

레벨에 표시되는 그림의 이름 (예: '바나나')

ad_reward_prompt

ad_unit_id

보상형 동영상 광고를 표시하는 데 사용되는 광고 단위 ID

ad_reward_impression

ad_unit_id

보상형 동영상 광고를 표시하는 데 사용되는 광고 단위 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# 스크립트를 만들고 Analytics 폴더 아래에 QuizAnalytics.cs로 이름을 지정합니다.

아래 코드를 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);
        }
    }
}

게임에서 애널리틱스 이벤트 로깅

Assets/Scripts/Scenes 폴더 아래에서 Game.cs 파일을 엽니다. AwesomeDrawingQuiz.Analytics 네임스페이스에 있는 QuizAnalytics 클래스를 사용하려면 다음과 같이 using 지시문을 추가합니다.

장면/Game.cs

using AwesomeDrawingQuiz.Ads;

// TODO: Import AwesomeDrawingQuiz.Analytics (101)
using AwesomeDrawingQuiz.Analytics;

...

namespace AwesomeDrawingQuiz.Scene {
   ...
}

다음으로, Start() 함수에서 QuizAnalytics.SetScreenName()를 호출하여 현재 화면의 이름을 변경합니다. 또한 QuizAnalytics.LogGameStart()를 호출하여 게임이 시작되었음을 나타냅니다.

장면/Game.cs

void Start () {
    // TODO: Log screen name (101)
    QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_GAME);

    ...

    SetHintButtonEnabled(false);

    // TODO: Log game_start event (101)
    QuizAnalytics.LogGameStart();
    
    ...
}

다음으로 콜백 함수에서 다음과 같이 맞춤 이벤트를 기록하는 호출을 추가합니다.

장면/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);

    ...
}

마지막으로 Assets/Scripts/Scenes 폴더 아래의 Main.cs 파일을 업데이트합니다. 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에서 디버그 모드 사용 설정

일반적으로 앱에 로깅되는 이벤트는 약 1시간에 걸쳐 취합된 후 업로드됩니다. 분석 구현을 즉시 검증하려면 개발 기기에서 디버그 모드를 사용 설정하여 최소한의 지연으로 이벤트를 업로드해야 합니다.

먼저 Android 스튜디오에서 터미널 도구를 엽니다. 하단 툴바에 있습니다.

c8dc1b4f08a224b8.png

그런 다음, 다음 명령어를 실행합니다 (테스트 Android 기기가 컴퓨터에 연결되어 있는지 또는 Android Emulator가 실행 중인지 확인).

adb shell setprop debug.firebase.analytics.app com.google.codelab.awesomedrawingquiz

이 동작은 다음 명령어를 실행하여 디버그 모드를 명시적으로 사용 중지할 때까지 유지됩니다.

adb shell setprop debug.firebase.analytics.app .none.

iOS에서 디버그 모드 사용 설정

개발 기기에서 애널리틱스 디버그 모드를 사용 설정하려면 Xcode에서 다음 명령줄 인수를 지정합니다.

-FIRDebugEnabled

이 동작은 아래의 명령줄 인수를 지정하여 디버그 모드를 명시적으로 사용 중지할 때까지 유지됩니다.

-FIRDebugDisabled

DebugView로 애널리틱스 이벤트 디버그

테스트 기기에서 디버그 모드를 사용 설정했으면 Firebase Console로 이동하여 메뉴에서 DebugView를 선택합니다. 그런 다음 테스트 기기에서 게임을 플레이하여 이벤트가 로깅되고 DebugView 보고서에 표시되는지 확인합니다.

827059255d09ac00.png

이벤트 이름을 클릭하여 각 이벤트에 대한 세부정보에 액세스할 수 있습니다. 예를 들어 다음 스크린샷은 level_start 이벤트와 연결된 매개변수 세부정보를 보여줍니다.

475db00d05d03ab8.png

자세한 내용은 DebugView 고객센터 도움말을 참고하세요.

10. 매개변수 보고 사용 설정

Firebase용 Google 애널리틱스는 기본적으로 총 이벤트 수를 수집하지만 관심 있는 이벤트 매개변수마다 맞춤 매개변수에 대한 보고를 명시적으로 사용 설정해야 합니다. 이 기능을 사용 설정하면 Firebase용 Google 애널리틱스에 맞춤 매개변수의 통계를 보여주는 추가 카드가 표시됩니다.

이벤트에 대한 맞춤 매개변수를 등록하려면 다음 절차를 따르세요.

  1. Firebase Console로 이동하여 앞에서 만든 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

위의 스크린샷에 따르면 지평선의 오답이 가장 많으므로 다른 수준에 비해 사용자가 어려움을 겪고 있음을 쉽게 알 수 있습니다.

여기에서 얻은 통계를 활용하면 초보 사용자에게 높은 유지율을 유지하기 위해 어려운 레벨을 제공하지 않을지 결정할 수 있습니다.

레벨을 완료하기 위해 시도한 평균 횟수는 얼마인가요?

Awesome Drawing Quiz에서 사용자는 각 레벨에 원하는 만큼 답변을 제출할 수 있습니다.

level_success 이벤트에서 number_of_attempts 매개변수에 대한 매개변수 보고를 사용 설정했으므로 해당 매개변수의 세부 측정항목을 볼 수 있습니다.

이벤트 보고서에서 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에 가깝다면 리워드 (힌트)가 사용자에게 그다지 매력적이지 않다는 신호입니다. 또한 보상형 동영상 광고에서 더 많은 수익을 거둘 수 있는 기회를 놓치고 있습니다.

따라서 사용자가 게임에 더 깊이 참여하고 보상형 동영상 광고의 수익을 높일 수 있도록 사용자에게 더 유용한 보상을 제공하는 것을 고려해야 합니다.

각 게임에서 평균적으로 몇 개의 레벨을 완료했나요?

Awesome Drawing Quiz의 게임마다 총 6개의 레벨이 있습니다. 사용자가 6개의 레벨을 완료하면 (각 레벨이 지우거나 실패했는지와 상관없이) number_of_correct_answers가 매개변수로 사용되어 game_complete 이벤트가 트리거됩니다.

number_of_correct_answers는 사용자가 통과한 레벨의 수를 나타내므로 (정답을 제공함) number_of_correct_answers 매개변수의 측정항목을 살펴보면 답을 찾을 수 있습니다.

이벤트 보고서에서 game_complete 이벤트를 클릭합니다. game_complete 이벤트 보고서에서 number_of_correct_answers 카드를 찾습니다. 평균 이벤트 매개변수 number_of_correct_answers개가 표시됩니다.

d9eeaa019d1bceb4.png

평균 레벨 수가 너무 적으면 흥미를 잃지 않고 게임을 계속할 수 있도록 게임을 다시 정렬하여 레벨을 달성하는 데 도움을 주는 것이 좋습니다.

12. 완료

AdMob+Firebase 101 Unity Codelab을 완료했습니다. 이 Codelab의 완료된 코드는 android_studio_folder.png101-complete_and_102-base 폴더에서 확인할 수 있습니다.

AdMob+Firebase Codelab의 다음 부분에서는 유입경로를 사용하여 앱 이벤트 흐름을 시각화하는 방법을 알아봅니다. 또한 앱 업데이트 없이 원격 구성과 A/B 테스트를 사용하여 게임에서 매개변수 값을 최적화하는 방법도 다룹니다.