Unity 앱에 AdMob 앱 오프닝 광고 추가

1. 소개

이 Codelab에서는 Unity 앱에 AdMob 앱 오프닝 광고를 구현합니다.

빌드할 내용

이 Codelab에서는 Google 모바일 광고 Unity 플러그인을 사용하여 Unity 앱에 AdMob 앱 오프닝 광고를 구현하는 방법을 설명합니다.

6338548c3f73e7cf.gif

이 Codelab을 진행하는 동안 문제(코드 버그, 문법 오류, 불명확한 문구 등)가 발생하는 경우 Codelab 왼쪽 하단의 오류 신고 링크를 통해 문제를 신고해 주세요.

학습 내용

  • Google 모바일 광고 Unity 플러그인을 구성하는 방법
  • Unity 앱에 앱 오프닝 광고를 구현하는 방법

필요한 사항

  • Unity 2018.4 이상
  • Xcode 12 이상 및 CocoaPods(iOS 배포용)

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

초급 중급 고급

2. 개발 환경 설정

코드 다운로드

zip 파일을 다운로드한 후 콘텐츠를 추출합니다. 그러면 admob-appopen-unity-main라는 폴더가 생성됩니다.

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

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

저장소에는 다음 두 폴더가 포함되어 있습니다.

  • android_studio_folder.png starter: 이 Codelab에서 빌드할 시작 코드입니다.
  • android_studio_folder.png complete: 이 Codelab을 위해 완료된 코드입니다.

3. AdMob 앱 및 광고 단위 설정

Unity는 멀티 플랫폼 SDK이므로 AdMob에서 Android 및 iOS 모두를 위한 앱과 광고 단위를 추가해야 합니다.

Android용으로 설정

Android용으로 설정하려면 Android 앱을 추가하고 광고 단위를 만들어야 합니다.

Android 앱 추가

  1. AdMob 콘솔 메뉴에서 앱 추가를 클릭합니다.
  2. 플랫폼으로 Android를 선택합니다. 지원되는 앱 스토어에 앱이 등록되어 있나요?라는 메시지가 표시되면 아니요를 클릭합니다.
  3. 앱 이름 필드에 AdMob app open ad를 입력합니다.
  4. 이 Codelab을 완료하기 위해 사용자 측정항목을 사용 설정하지 않아도 됩니다. 하지만 사용자 측정항목을 사용 설정하면 사용자 행동을 자세히 파악할 수 있으므로 사용 설정하는 것이 좋습니다. 추가를 클릭하여 절차를 완료합니다.

광고 단위 만들기

  1. AdMob 콘솔의 메뉴에서 AdMob app open ad 앱(Android)을 선택합니다.
  2. 광고 단위 메뉴를 클릭합니다.

  1. 광고 단위 추가를 클릭합니다.
  2. 형식으로 앱 오프닝을 선택합니다.
  3. 광고 단위 이름 필드에 android-appopen을 입력합니다.
  4. 광고 단위 만들기를 클릭하여 절차를 완료합니다.

대게 새 광고 단위에서 광고를 게재하기까지 몇 시간이 소요됩니다.

광고의 작동 방식을 즉시 테스트하려면 Android 앱 ID/광고 단위 ID 및 iOS 앱 ID/광고 단위 ID 표에 표시된 테스트 앱 ID 및 광고 단위 ID를 사용하세요.

iOS용으로 설정

iOS용으로 설정하려면 iOS 앱을 추가하고 광고 단위를 만들어야 합니다.

iOS 앱 추가

  1. AdMob 콘솔 메뉴에서 앱 추가를 클릭합니다.
  2. 플랫폼으로 iOS를 선택합니다. 지원되는 앱 스토어에 앱이 등록되어 있나요?라는 메시지가 표시되면 아니요를 클릭합니다.
  3. 앱 이름 필드에 AdMob app open ad를 입력합니다.
  4. 이 Codelab을 완료하기 위해 사용자 측정항목을 사용 설정하지 않아도 됩니다. 하지만 사용자 측정항목을 사용 설정하면 사용자 행동을 자세히 파악할 수 있으므로 사용 설정하는 것이 좋습니다. 추가를 클릭하여 절차를 완료합니다.

광고 단위 만들기

  1. AdMob 콘솔의 메뉴에서 AdMob inline ads 앱(iOS)을 선택합니다.
  2. 광고 단위 메뉴를 클릭합니다.

  1. 광고 단위 추가를 클릭합니다.
  2. 형식으로 앱 오프닝을 선택합니다.
  3. 광고 단위 이름 필드에 ios-appopen을 입력합니다.
  4. 광고 단위 만들기를 클릭하여 절차를 완료합니다.

대게 새 광고 단위에서 광고를 게재하기까지 몇 시간이 소요됩니다.

광고의 작동 방식을 즉시 테스트하려면 다음 표에 표시된 테스트 앱 ID 및 광고 단위 ID를 사용하세요.

선택사항: 테스트 AdMob 앱 및 광고 단위 사용

새 애플리케이션과 광고 단위를 직접 만들지 않고 Codelab을 따르려면 다음 표에 나와 있는 테스트 AdMob 앱 ID와 광고 단위 ID를 사용하면 됩니다.

Android 앱 ID/광고 단위 ID

항목

앱 ID/광고 단위 ID

AdMob 앱 ID

ca-app-pub-3940256099942544~3347511713

광고 단위 ID

ca-app-pub-3940256099942544/3419835294

iOS 앱 ID/광고 단위 ID

항목

앱 ID/광고 단위 ID

AdMob 앱 ID

ca-app-pub-3940256099942544~1458002511

광고 단위 ID

ca-app-pub-3940256099942544/5662855259

테스트 광고에 대한 자세한 내용은 Android 테스트 광고iOS 테스트 광고 개발자 문서를 참고하세요.

4. Google 모바일 광고 Unity 플러그인 추가

AdMob 광고를 게재하고 수익을 창출하려면 먼저 Google 모바일 광고 Unity 플러그인을 통합해야 합니다.

모바일 광고 Unity 플러그인 다운로드

Google 모바일 광고 Unity 플러그인을 사용하면 Unity 개발자는 Android 및 iOS 앱에 Google 모바일 광고를 쉽게 게재할 수 있습니다. 이 플러그인에서는 Unity 프로젝트의 C# 스크립트에서 사용되는 광고를 요청하기 위한 C# 인터페이스를 제공합니다.

아래 링크를 사용하여 플러그인용 Unity 패키지를 다운로드합니다.

starter 프로젝트 열기

  1. Unity Hub를 실행합니다.
  2. Projects(프로젝트) 탭에서 ADD(추가) 버튼을 클릭합니다.
  3. 개발 환경 설정 단계에서 다운로드한 코드를 추출한 폴더로 이동합니다.
  4. starter 폴더를 엽니다.
  5. 프로젝트 목록에 starter 프로젝트가 표시됩니다. 프로젝트를 클릭하여 Unity 에디터에서 엽니다.

모바일 광고 Unity 플러그인 가져오기

  1. Unity 에디터의 메뉴에서 Assets(애셋) > Import Package(패키지 가져오기) > Custom Package(맞춤 패키지)를 선택합니다.
  2. 이전 단계에서 다운로드한 GoogleMobileAds-{VERSION}.unitypackage를 선택합니다.
  3. 모든 파일이 선택된 상태인지 확인한 후 Import(가져오기)를 클릭합니다.

AdMob 앱 ID 설정

  1. Unity 에디터의 메뉴에서 Assets(애셋) > Google Mobile Ads(Google 모바일 광고) > Settings(설정)를 선택합니다.
  2. 각 필드에 Android 및 iOS AdMob 앱 ID를 입력합니다. 새 애플리케이션과 광고 단위를 직접 만들지 않고 Codelab을 따르려면 다음과 같이 테스트 AdMob 앱 ID를 입력합니다.

8890521e199b1090.png

5. 유틸리티 클래스 생성

Scripts 폴더에 AppOpenAdManager라는 새 클래스를 만듭니다. 이 클래스는 플랫폼별로 로드된 광고 및 광고 단위 ID를 추적하는 인스턴스 변수를 관리합니다.

AppOpenAdManager.cs

using System;
using GoogleMobileAds.Api;
using UnityEngine;

public class AppOpenAdManager
{
#if UNITY_ANDROID
    // Test ad unit ID: ca-app-pub-3940256099942544/3419835294
    private const string AD_UNIT_ID = "<YOUR_ANDROID_APPOPEN_AD_UNIT_ID>";
#elif UNITY_IOS
    // Test ad unit ID: ca-app-pub-3940256099942544/5662855259
    private const string AD_UNIT_ID = "<YOUR_IOS_APPOPEN_AD_UNIT_ID>";
#else
    private const string AD_UNIT_ID = "unexpected_platform";
#endif

    private static AppOpenAdManager instance;

    private AppOpenAd ad;

    private bool isShowingAd = false;

    public static AppOpenAdManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new AppOpenAdManager();
            }

            return instance;
        }
    }

    private bool IsAdAvailable
    {
        get
        {
            return ad != null;
        }
    }

    public void LoadAd()
    {
        // TODO: Load an app open ad.
    }
}

광고 로드

광고는 정적 AppOpenAd.LoadAd() 메서드를 사용하여 로드됩니다. 로드 메서드가 작동하려면 광고 단위 ID, ScreenOrientation 모드, AdRequest 객체, 광고 로드에 성공하거나 실패할 때 호출되는 완료 핸들러가 필요합니다.

로드된 AppOpenAd 객체는 완료 핸들러의 매개변수로 제공됩니다. 다음과 같이 LoadAd() 메서드를 구현합니다.

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    public void LoadAd()
    {
        AdRequest request = new AdRequest.Builder().Build();

        // Load an app open ad for portrait orientation
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                // Handle the error.
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            // App open ad is loaded.
            ad = appOpenAd;
        }));
    }
}

광고 게재

광고를 표시하기 전에 각 광고 이벤트를 리슨할 수 있도록 각 이벤트 핸들러를 등록합니다.

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    public void ShowAdIfAvailable()
    {
        if (!IsAdAvailable || isShowingAd)
        {
            return;
        }

        ad.OnAdDidDismissFullScreenContent += HandleAdDidDismissFullScreenContent;
        ad.OnAdFailedToPresentFullScreenContent += HandleAdFailedToPresentFullScreenContent;
        ad.OnAdDidPresentFullScreenContent += HandleAdDidPresentFullScreenContent;
        ad.OnAdDidRecordImpression += HandleAdDidRecordImpression;
        ad.OnPaidEvent += HandlePaidEvent;

        ad.Show();
    }

    private void HandleAdDidDismissFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Closed app open ad");
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        isShowingAd = false;
        LoadAd();
    }

    private void HandleAdFailedToPresentFullScreenContent(object sender, AdErrorEventArgs args)
    {
        Debug.LogFormat("Failed to present the ad (reason: {0})", args.AdError.GetMessage());
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        LoadAd();
    }

    private void HandleAdDidPresentFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Displayed app open ad");
        isShowingAd = true;
    }

    private void HandleAdDidRecordImpression(object sender, EventArgs args)
    {
        Debug.Log("Recorded ad impression");
    }

    private void HandlePaidEvent(object sender, AdValueEventArgs args)
    {
        Debug.LogFormat("Received paid event. (currency: {0}, value: {1}",
                args.AdValue.CurrencyCode, args.AdValue.Value);
    }
}

광고 만료 고려

앱 오프닝의 광고 참조는 4시간 후에 타임아웃됩니다. 요청 후 4시간이 지나 렌더링된 광고는 더 이상 유효하지 않으며 수익 창출이 불가능할 수 있습니다.

만료된 광고가 게재되지 않도록 하려면 광고가 로드된 후 경과한 시간을 확인하는 IsAdAvailable 속성을 AppOpenAdManager로 수정합니다. 그런 다음 이 메서드를 이용해 광고가 여전히 유효한지 확인하세요.

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    // TODO: Add loadTime field
    private DateTime loadTime;

    private bool IsAdAvailable
    {
        get
        {
            // TODO: Consider ad expiration
            return ad != null && (System.DateTime.UtcNow - loadTime).TotalHours < 4;
        }
    }

    public void LoadAd()
    {
        if (IsAdAvailable)
        {
            return;
        }

        AdRequest request = new AdRequest.Builder().Build();
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            ad = appOpenAd;
            Debug.Log("App open ad loaded");

            // TODO: Keep track of time when the ad is loaded.
            loadTime = DateTime.UtcNow;
        }));
    }
}

6. 광고를 로드/게재할 장면 업데이트

장면이 시작될 때 앱 오프닝 광고를 로드하도록 MainScene 클래스의 Start() 메서드를 업데이트합니다.

앱 포그라운드 이벤트에 대한 알림을 받으려면 AppStateEventNotifier 싱글톤을 리슨하는 것이 좋습니다. AppStateEventNotifier.AppStateChanged 대리자를 구현하면 앱에 앱 실행 및 포그라운드 이벤트가 전달되며 광고가 게재될 수 있습니다.

MainScene.cs

using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using UnityEngine;

public class MainScene : MonoBehaviour
{
    public void Start()
    {
        // TODO: Request an app open ad.
        MobileAds.Initialize((initStatus) =>
        {
            AppOpenAdManager.Instance.LoadAd();
            AppStateEventNotifier.AppStateChanged += OnAppStateChanged;
        });
    }

    public void OnAppStateChanged(AppState state)
    {
        if (state == AppState.Foreground)
        {
            // TODO: Show an app open ad if available.
            AppOpenAdManager.Instance.ShowAdIfAvailable();
        }
    }
}

준비가 끝났습니다. 기기 또는 에뮬레이터에서 프로젝트를 빌드하고 실행합니다. 앱이 실행되면 광고가 완전히 로드될 때까지 몇 초 동안 기다립니다.

그런 다음 다른 앱/홈 화면에서 원래 앱으로 다시 전환하면 아래와 같이 앱 오프닝 광고가 표시됩니다.

6338548c3f73e7cf.gif

7. 모두 완료

Codelab을 완료했습니다. 이 Codelab의 완료된 코드는 android_studio_folder.pngcomplete 폴더에서 확인할 수 있습니다.