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 가상 기기)를 실행하는 Android Emulator
  • iOS 8.0 이상을 실행하는 iOS 기기 또는 시뮬레이터

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

초급 중급 고급

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

초급 중급 고급

2. 개발 환경 설정

코드 다운로드

다음 버튼을 클릭하여 이 Codelab의 모든 코드를 다운로드합니다.

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

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

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

저장소에는 다음과 같은 네 개의 폴더가 포함되어 있습니다.

  • android_studio_folder.png101-base: 이 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를 실행하고 시작 화면에서 '열기'를 선택합니다. 그런 다음 다운로드한 코드에서 101-base 디렉터리를 선택합니다.

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

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

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

Android 설정

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

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

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

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

7672f41ec611101b.png

  1. 원하는 광고 단위 이름을 입력합니다. 그런 다음 리워드 금액을 1로, 리워드 아이템을 '힌트'로 설정합니다 (이는 앱에서 현재 사용자에게 제공하는 리워드임). 광고 단위 만들기를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.

6d067814a2c38264.png

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

4bc1b3b341a5a81c.png

  1. Unity 프로젝트로 돌아가 AdMob 앱 ID 및 광고 단위 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로, 리워드 아이템을 '힌트'로 설정합니다 (이는 앱에서 현재 사용자에게 제공하는 리워드임). 광고 단위 만들기를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.

6d067814a2c38264.png

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

4bc1b3b341a5a81c.png

  1. Unity 프로젝트로 돌아가 AdMob 앱 ID 및 광고 단위 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 프로젝트 프로젝트에서 Assets > Import Package > Custom Package로 이동합니다.
  3. 다운로드한 프로젝트로 GoogleMobileAds.unitypackage를 가져옵니다.

AdMob 앱 ID 구성

Unity 편집기의 메뉴에서 Assets(애셋) > Google Mobile Ads(Google 모바일 광고) > Settings(설정)를 선택합니다.

44fc84fe88235c1f.png

Google AdMob 섹션의 Enabled(사용 설정됨) 체크박스를 클릭하여 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. 프로젝트 추가를 선택하고 프로젝트 이름을 '멋진 그림 퀴즈'로 지정합니다.

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. 멋진 그림 퀴즈 (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 프로젝트를 열고 Assets > Import Package > Custom Package로 이동합니다.
  3. 압축을 푼 SDK에서 원격 구성 SDK (dotnet4/FirebaseAnalytics.unitypackage)를 가져옵니다.
  4. 'Unity 패키지 가져오기' 창에서 가져오기를 클릭합니다.

6. AdMob을 Firebase 프로젝트에 연결

앱을 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 콘솔에서 몇 가지 추가 기능이 잠금 해제됩니다.

수익 카드 (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

그림의 이름을 모르는 경우 '건너뛰기' 버튼을 클릭하여 단계를 건너뛸 수 있습니다.

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

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_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

레벨에 표시된 그림의 이름 (예: 'banana')

level_wrong_answer

level_name

레벨에 표시된 그림의 이름 (예: 'banana')

ad_reward_prompt

ad_unit_id

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

ad_reward_impression

ad_unit_id

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

level_success

level_name

레벨에 표시된 그림의 이름 (예: 'banana')

level_success

number_of_attempts

레벨을 클리어하기 위해 시도한 횟수

level_success

elapsed_time_sec

레벨을 완료하는 데 걸린 시간(초)

level_success

hint_used

사용자가 힌트 (보상형 동영상 광고 시청)를 사용하여 레벨을 클리어했는지 여부 (1: 힌트 사용 / 0: 힌트 없이 레벨 클리어)

level_fail

level_name

레벨에 표시된 그림의 이름 (예: 'banana')

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로 지정합니다. 그런 다음 Analytics 폴더 아래에 새 C# 스크립트를 만들고 이름을 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 지시문을 추가합니다.

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);

    ...
}

마지막으로 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

위 스크린샷에 따르면 horizon의 오답 수가 가장 많으므로 다른 레벨에 비해 사용자에게 어렵다는 것을 쉽게 알 수 있습니다.

여기에서 얻은 유용한 정보를 바탕으로 초보 사용자에게 어려운 레벨을 제공하지 않아 높은 유지율을 유지할 수 있습니다.

레벨을 클리어하기 위해 시도한 횟수는 평균 몇 번인가요?

멋진 그림 퀴즈에서 사용자는 각 레벨의 답변을 원하는 만큼 제출할 수 있습니다.

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 테스팅을 사용하여 게임의 매개변수 값을 최적화하는 방법도 다룹니다.