보상형 광고

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

기본 요건

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

보상형 광고 객체 만들기

보상형 광고는 RewardedAd 객체에 의해 요청 및 표시됩니다. 보상형 광고를 게재하는 데 필요한 첫 번째 단계는 광고를 로드하는 데 사용할 광고 단위 ID가 있는 생성자를 호출하여 RewardedAd 객체를 인스턴스화하는 것입니다. 이 단계는 다음 코드 스니펫에 제시되어 있습니다.

using GoogleMobileAds.Api;
...
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 인스턴스가 인수로 필요합니다.

using GoogleMobileAds.Api;
...
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, AdErrorEventArgs 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 광고 이벤트에서 다른 보상형 광고를 로드하는 것이 좋습니다.

using GoogleMobileAds.Api;
...
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개의 개별적인 광고 개재위치에 2개의 보상형 광고를 로드하는 방법이 제시되어 있습니다.

using GoogleMobileAds.Api;
...
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;
    }
}

추가 리소스

샘플

다음 단계