보상형 광고

보상형 광고는 상호작용하는 사용자에게 인앱 보상을 제공하는 광고입니다. 이 가이드에서는 AdMob에서 Unity 앱에 보상형 광고를 통합하는 방법을 설명합니다. 고객 성공사례인 우수사례 1우수사례 2를 읽어보세요.

기본 요건

  • Unity 플러그인 3.16.0 이상
  • 시작하기를 모두 읽어보세요. Unity 앱에 Google 모바일 광고 Unity 플러그인이 있어야 합니다.

보상형 광고 객체 만들기

보상형 광고는 RewardedAd 객체에 의해 요청 및 표시됩니다. 보상형 광고를 게재하려면 먼저 광고 로드에 사용할 광고 단위 ID가 있는 생성자를 호출하여 RewardedAd 객체를 인스턴스화해야 합니다. 이 단계는 다음 코드 스니펫에 제시되어 있습니다.

Unity 편집기를 사용하여 보다 쉽게 광고를 통합하려면 새로운 광고 게재위치 베타를 사용해 보세요.

using UnityEngine.Events;
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using UnityEngine.UI;
using System;
using System.Collections.Generic;

public class GoogleMobileAdsDemoScript : MonoBehaviour
{
    private RewardedAd rewardedAd;
    ...

    public void Start()
    {
        ...

        this.rewardedAd = new RewardedAd(adUnitId);
    }
}

항상 테스트 광고로 테스트

앱을 제작하고 테스트할 때는 운영 중인 실제 광고 대신 테스트 광고를 사용하세요. 이렇게 하지 않으면 계정이 정지될 수 있습니다.

테스트 광고를 로드하는 가장 쉬운 방법은 Android 및 iOS 보상형 광고 전용 테스트 광고 단위 ID를 사용하는 것입니다.

Android

ca-app-pub-3940256099942544/5224354917

iOS

ca-app-pub-3940256099942544/1712485313

이 ID는 모든 요청에 대해 테스트 광고를 반환하도록 특별히 구성되었으며, 코딩, 테스트 및 디버깅 중에 앱에서 자유롭게 사용할 수 있습니다. 앱을 게시하기 전에 이 ID를 자체 광고 단위 ID로 바꿔야 합니다.

모바일 광고 SDK의 테스트 광고가 작동하는 방식을 자세히 알아보려면 테스트 광고를 참조하세요.

광고 로드하기

보상형 광고를 로드하려면 RewardedAd 객체의 loadAd() 메소드를 호출해야 합니다. 이 메소드에는 AdRequest 인스턴스가 인수로 필요합니다.

...
public class GoogleMobileAdsDemoScript : MonoBehaviour
{
    private RewardedAd rewardedAd;
    ...

    public void Start()
    {
        ...

        this.rewardedAd = new RewardedAd(adUnitId);

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the rewarded ad with the request.
        this.rewardedAd.LoadAd(request);
    }
}

광고 이벤트

광고의 작동 방식을 추가로 맞춤설정하려는 경우 광고의 수명 주기(예: 로드, 열기, 닫기 등)에서 여러 이벤트에 연결할 수 있습니다. 적절한 이벤트 핸들러에 대한 대리자를 등록하여 이러한 이벤트를 수신합니다. 가장 중요한 이벤트는 OnUserEarnedReward로 사용자가 동영상 시청에 대한 보상을 받을 때 호출됩니다. 다음과 같이 다른 광고 이벤트를 구현할 수도 있습니다.

using GoogleMobileAds.Api;
...
public class GoogleMobileAdsDemoScript : MonoBehaviour
{
    private RewardedAd rewardedAd;
    ...

    public void Start()
    {
        string adUnitId;
        #if UNITY_ANDROID
            adUnitId = "ca-app-pub-3940256099942544/5224354917";
        #elif UNITY_IPHONE
            adUnitId = "ca-app-pub-3940256099942544/1712485313";
        #else
            adUnitId = "unexpected_platform";
        #endif

        this.rewardedAd = new RewardedAd(adUnitId);

        // Called when an ad request has successfully loaded.
        this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        // Called when an ad request failed to load.
        this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
        // Called when an ad is shown.
        this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
        // Called when an ad request failed to show.
        this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
        // Called when the user should be rewarded for interacting with the ad.
        this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
        // Called when the ad is closed.
        this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the rewarded ad with the request.
        this.rewardedAd.LoadAd(request);
    }

    public void HandleRewardedAdLoaded(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdLoaded event received");
    }

    public void HandleRewardedAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        MonoBehaviour.print(
            "HandleRewardedAdFailedToLoad event received with message: "
                             + args.Message);
    }

    public void HandleRewardedAdOpening(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdOpening event received");
    }

    public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
    {
        MonoBehaviour.print(
            "HandleRewardedAdFailedToShow event received with message: "
                             + args.Message);
    }

    public void HandleRewardedAdClosed(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdClosed event received");
    }

    public void HandleUserEarnedReward(object sender, Reward args)
    {
        string type = args.Type;
        double amount = args.Amount;
        MonoBehaviour.print(
            "HandleRewardedAdRewarded event received for "
                        + amount.ToString() + " " + type);
    }
}

OnUserEarnedReward 이벤트는 특수 이벤트 인수를 제공합니다. 이 인수는 사용자에게 지급되는 보상을 설명하는 TypeAmount가 포함된 Reward 인스턴스를 전달합니다.

public void HandleUserEarnedReward(object sender, Reward args)
{
    string type = args.Type;
    double amount = args.Amount;
     MonoBehaviour.print(
          "HandleRewardedAdRewarded event received for "
              + amount.ToString() + " " + type);
}

사용 가능한 광고 이벤트

OnAdLoaded
광고 로드가 완료될 때 실행됩니다.
OnAdFailedToLoad
광고 로드에 실패할 때 실행됩니다. 제공된 AdErrorEventArgsMessage 속성은 발생한 실패의 유형을 설명합니다.
OnAdOpening
광고가 표시될 때 실행되며 기기 화면을 덮습니다. 이때 필요한 경우 앱의 오디오 출력 또는 게임 루프를 일시중지하는 것이 좋습니다.
OnAdFailedToShow
광고 표시에 실패할 때 실행됩니다. 제공된 AdErrorEventArgsMessage 속성은 발생한 실패의 유형을 설명합니다.
OnUserEarnedReward
사용자가 동영상 시청에 대한 보상을 받아야 할 때 실행됩니다. Reward 매개변수는 사용자에게 제공되는 보상을 설명합니다.
OnAdClosed
사용자가 닫기 아이콘을 탭하거나 뒤로 버튼을 사용하여 보상형 동영상 광고를 닫을 때 실행됩니다. 앱에서 오디오 출력 또는 게임 루프를 일시중지했을 때 이 메소드로 재개하면 편리합니다.

광고 게재

보상형 광고를 게재하기 전에 사용자에게 보상을 대가로 보상형 광고 콘텐츠를 시청할지 여부를 명확히 선택할 수 있는 옵션을 제공해야 합니다. 보상형 광고에는 항상 선택 옵션을 제공해야 합니다.

보상형 동영상 광고를 표시하려면 IsLoaded() 메소드를 사용하여 로드가 완료되었는지 확인한 다음 show()를 호출하세요. 다음은 이 작업의 실행 방법을 보여주는 예입니다.

private void UserChoseToWatchAd()
{
  if (this.rewardedAd.IsLoaded()) {
    this.rewardedAd.Show();
  }
}

OnAdClosed를 사용하여 다음 보상형 광고 미리 로드

RewardedAd는 일회용 객체입니다. 즉, 보상형 광고가 표시된 후에는 이 객체를 사용해 다른 광고를 로드할 수 없습니다. 다른 보상형 광고를 요청하려면 새 RewardedAd 객체를 만들어야 합니다.

이전 광고가 닫힌 직후에 다음 보상형 광고가 로드되기 시작하도록 OnAdClosed 광고 이벤트에서 다른 보상형 광고를 로드하는 것이 좋습니다.

...
public class GoogleMobileAdsDemoScript : MonoBehaviour
{
    private RewardedAd rewardedAd;
    ...

    public void CreateAndLoadRewardedAd()
    {
        #if UNITY_ANDROID
            string adUnitId = "ca-app-pub-3940256099942544/5224354917";
        #elif UNITY_IPHONE
            string adUnitId = "ca-app-pub-3940256099942544/1712485313";
        #else
            string adUnitId = "unexpected_platform";
        #endif

        this.rewardedAd = new RewardedAd(adUnitId);

        this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
        this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the rewarded ad with the request.
        this.rewardedAd.LoadAd(request);
    }

...

    public void HandleRewardedAdClosed(object sender, EventArgs args)
    {
        this.CreateAndLoadRewardedAd();
    }
}

여러 보상형 광고 로드

다수의 보상형 광고를 로드하려면 보상형 광고 객체 만들기 광고 로드 섹션에 안내된 단계를 로드할 광고마다 적용하세요. 아래의 코드 스니펫에는 두 광고 게재위치에 2개의 보상형 광고를 로드하는 방법이 나와 있습니다.

...
public class GoogleMobileAdsDemoScript : MonoBehaviour
{
    private RewardedAd gameOverRewardedAd;
    private RewardedAd extraCoinsRewardedAd;
    ...
    public void Start()
    {
        ...

        this.gameOverRewardedAd = CreateAndLoadRewardedAd(adUnitId);
        this.extraCoinsRewardedAd = CreateAndLoadRewardedAd(adUnitId);
    }

    public RewardedAd CreateAndLoadRewardedAd(string adUnitId)
    {
        RewardedAd rewardedAd = new RewardedAd(adUnitId);

        rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
        rewardedAd.OnAdClosed += HandleRewardedAdClosed;

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the rewarded ad with the request.
        rewardedAd.LoadAd(request);
        return rewardedAd;
    }
}

샘플