보상형 광고

보상형 광고는 사용자가 광고를 시청하면 보상을 받는 인기 있는 전체 화면 광고 형식입니다.

이 광고 유형의 표시는 예를 들어 게임에서 보너스나 추가 생명을 받으려는 사용자에 의해 활성화됩니다.

사용자 동기 부여가 높기 때문에 무료 앱에서 가장 인기 있고 수익성이 높은 광고 형식입니다.

표시 예

이 가이드는 Unity 앱에 보상형 광고를 통합하는 방법을 보여줍니다. 코드 예시와 지침 외에도 형식별 권장 사항 및 추가 리소스에 대한 링크가 포함되어 있습니다.

사전 준비

  1. Yandex Mobile Ads Unity Plugin을 통합하려면 빠른 시작의 프로세스를 수행하세요.
  2. 최신 Yandex Mobile Ads Unity Plugin 버전을 실행하고 있는지 확인하세요. 중재를 사용하는 경우, 최신 통합 빌드 버전을 실행하고 있는지도 확인하세요.

실행

보상형 광고 통합을 위한 주요 단계:

  1. RewardedAdLoader 광고 로더를 생성하고 광고 로딩 이벤트에 대한 리스너를 등록합니다.
  2. 광고 로딩 매개변수를 AdRequestConfiguration에 설정합니다.
  3. RewardedAdLoader.LoadAd(AdRequestConfiguration) 메서드를 사용하여 광고를 로드합니다.
  4. 사용자가 광고와 상호 작용하는 이벤트에 대한 리스너를 등록합니다.
  5. RewardedAd.Show() 메서드를 호출하여 광고를 표시합니다.
  6. 리소스를 릴리스합니다.

보상형 광고 통합의 특징

  1. onAdFailedToLoad 이벤트에서 오류가 발생한 경우, 새로운 광고를 다시 로드하려고 시도하지 마세요. 다른 옵션이 없는 경우, 광고 로드 재시도 횟수를 제한하세요. 이렇게 하면 제한이 발생할 때 지속적인 실패 요청과 연결 문제를 방지할 수 있습니다.

  2. 성과 향상을 위해 모든 광고 로드에 대해 RewardedAdLoader의 단일 인스턴스를 사용하는 것이 좋습니다.

단계별 가이드

  1. GameObject에 첨부된 C# 스크립트에서 RewardedAdLoader 객체를 생성한 다음 광고 로드 이벤트 리스너를 등록합니다.
using UnityEngine;
using YandexMobileAds;
using YandexMobileAds.Base;

public class YandexMobileAdsRewardedAdDemoScript : MonoBehaviour
{
    private RewardedAdLoader rewardedAdLoader;
    private RewardedAd rewardedAd;

    private void SetupLoader()
    {
        rewardedAdLoader = new RewardedAdLoader();
        rewardedAdLoader.OnAdLoaded += HandleAdLoaded;
        rewardedAdLoader.OnAdFailedToLoad += HandleAdFailedToLoad;
        // ...
    }

    public void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
    {
        // 보상형 광고가 성공적으로 로드되었습니다. 이제 처리할 수 있습니다.
        rewardedAd = args.RewardedAd;
    }

    public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        // 광고 {args.AdUnitId}(이)가 {args.Message}와(과) 함께 로드에 실패함
        // OnAdFailedToLoad 이벤트에서 새 광고를 로드하려는 시도는 권장되지 않습니다.
    }
}
  1. 광고 로드 매개변수를 AdRequestConfiguration에 설정합니다.

    string adUnitId = "demo-rewarded-yandex"; // "R-M-XXXXXX-Y"로 교체
    AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
    

    AdUnitId: 파트너 인터페이스에서 발급된 고유 식별자로, 다음과 같이 표시됩니다. R-M-XXXXXX-Y.

    Совет

    테스트 목적으로, 데모 단위 ID: "demo-rewarded-yandex"를 사용할 수 있습니다. 광고를 게시하기 전에 데모 단위 ID를 실제 광고 단위 ID로 교체하십시오.

    사용자 관심사, 컨텍스트 앱 데이터, 위치 세부 정보 또는 기타 정보를 전달함으로써 AdRequestConfiguration.Builder를 통해 광고 요청 매개변수 세트를 확장할 수 있습니다. 요청에 추가적인 컨텍스트 데이터를 제공하면 광고 품질을 크게 향상할 수 있습니다.

  2. LoadAd 메서드로 광고를 로드하고, AdRequestConfiguration를 인수로 전달합니다.

rewardedAdLoader.LoadAd(adRequestConfiguration);
  1. 사용자가 광고와 상호 작용하는 이벤트에 대한 리스너를 등록합니다.

    using System;
    
    // ...
    rewardedAd.OnAdClicked += HandleAdClicked;
    rewardedAd.OnAdShown += HandleAdShown;
    rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
    rewardedAd.OnAdImpression += HandleImpression;
    rewardedAd.OnAdDismissed += HandleAdDismissed;
    rewardedAd.OnRewarded += HandleRewarded;
    // ...
    
    public void HandleAdClicked(object sender, EventArgs args)
    {
        // 보상형 광고에 대한 클릭이 기록될 때 호출됩니다.
    }
    
    public void HandleAdShown(object sender, EventArgs args)
    {
        // 광고가 표시될 때 호출됩니다.
    }
    
    public void HandleAdFailedToShow(object sender, AdFailureEventArgs args)
    {
        // 광고를 표시하는 데 실패했을 때 호출됩니다.
    }
    
    public void HandleAdDismissed(object sender, EventArgs args)
    {
        // 광고가 해제되었을 때 호출됩니다.
    }
    
    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // 광고에 대한 노출이 기록될 때 호출됩니다.
    }
    
    public void HandleRewarded(object sender, Reward args)
    {
        // 사용자가 {args.type} 및 {args.amount}을 보상받을 수 있을 때 호출됩니다.
    }
    
  2. RewardedAd 객체에서 Show()를 호출하여 광고를 표시합니다.

private void ShowRewardedAd()
{
    if (rewardedAd != null)
    {
        rewardedAd.Show();
    }
}
  1. 표시된 광고에 대해 Destroy()를 호출하고 현재 화면에서 더 이상 사용되지 않는 링크를 삭제합니다.

    이는 리소스를 릴리스하고 메모리 누수를 방지합니다.

    public void DestroyRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
    }
    

보상형 광고 통합 테스트

광고 테스트를 위한 데모 광고 단위 사용

보상형 광고 통합 및 앱 자체를 테스트하기 위해 테스트 광고를 사용하는 것이 좋습니다.

모든 광고 요청에 대해 테스트 광고가 반환되도록 보장하기 위해 특별한 데모 광고 배치 ID를 생성했습니다. 광고 통합을 확인하는 데 사용하세요.

데모 adUnitId: demo-rewarded-yandex.

Важно

앱을 스토어에 게시하기 전에 데모 광고 배치 ID를 Partner Interface에서 가져온 실제 ID로 교체해야 합니다.

사용 가능한 데모 광고 배치 ID 목록은 테스트용 데모 광고 단위 섹션에서 찾을 수 있습니다.

광고 통합 테스트

SDK의 내장 분석기를 사용하여 보상형 광고 통합을 확인할 수 있습니다.

이 도구는 보상형 광고가 제대로 통합되었는지 확인하고 로그에 상세한 보고서를 출력합니다. 보고서를 보려면 Android 앱 디버깅을 위한 Logcat 도구에서 "YandexAds" 키워드를 검색하세요.

adb logcat -v brief '*:S YandexAds'

통합에 성공하면 다음 메시지가 표시됩니다.

adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type rewarded was integrated successfully

보상형 광고 통합에 문제가 있는 경우, 문제에 대한 상세한 보고서와 해결 방법에 대한 권장 사항을 받게 됩니다.

광고 테스트를 위한 데모 광고 단위 사용

광고 통합 및 앱 자체를 테스트하기 위해 테스트 광고를 사용하는 것이 좋습니다.

모든 광고 요청에 대해 테스트 광고가 반환되도록 보장하기 위해 특별한 데모 광고 배치 ID를 생성했습니다. 광고 통합을 확인하는 데 사용하세요.

데모 adUnitId: demo-rewarded-yandex.

Важно

앱을 스토어에 게시하기 전에 데모 광고 단위 ID를 Partner Interface에서 가져온 실제 ID로 교체해야 합니다.

사용 가능한 데모 광고 배치 ID 목록은 테스트용 데모 광고 단위 섹션에서 찾을 수 있습니다.

광고 통합 테스트

네이티브 콘솔 도구를 사용하여 광고 통합을 테스트할 수 있습니다.

자세한 로그를 보려면 YMAMobileAds 클래스의 enableLogging 메서드를 호출하세요.

YMAMobileAds.enableLogging()

SDK 로그를 보려면 콘솔 도구로 이동하여 Subsystem = com.mobile.ads.ads.sdk를 설정하세요. 카테고리와 오류 수준별로 로그를 필터링할 수도 있습니다.

광고 통합에 문제가 있는 경우, 문제에 대한 상세한 보고서와 해결 방법에 대한 권장 사항을 받게 됩니다.

광고 사전 로드

광고 로딩은 모바일 중재에 연결된 광고 네트워크 수와 사용자의 인터넷 속도에 따라 몇 초가 걸릴 수 있습니다. 광고를 표시하기 전에 미리 로드하는 것을 권장합니다.

gameObject에 대해 Awake 메서드에서 광고 로드를 호출할 수 있습니다. DontDestroyOnLoad() 호출을 사용하여 장면 간 객체를 보존해야 합니다. 이는 로드된 광고가 장면 변경 시 gameObject와 함께 삭제되지 않도록 보장합니다.

private void Awake()
{
    SetupLoader();
    RequestRewardedAd();
    DontDestroyOnLoad(gameObject);
}

이와 함께 광고 표시가 완료되거나 실패할 때 실행되는 콜백 함수에 다음 광고 로딩을 바인딩할 수 있습니다. 예를 들면 다음과 같습니다.

public void HandleAdFailedToShow(object sender, EventArgs args)
{
    // 광고를 표시하는 데 실패했을 때 호출됩니다.

    // 광고 해제 후 리소스를 정리합니다.
    DestroyRewardedAd();

    // 이제 다음 보상형 광고를 미리 로드할 수 있습니다.
    RequestRewardedAd();
}

public void HandleAdDismissed(object sender, EventArgs args)
{
    // 광고가 해제되었을 때 호출됩니다.

    // 광고 해제 후 리소스를 정리합니다.
    DestroyRewardedAd();

    // 이제 다음 보상형 광고를 미리 로드할 수 있습니다.
    RequestRewardedAd();
}

표시될 가능성이 낮은 너무 많은 화면에 광고를 캐시하면 광고 효과가 떨어질 수 있습니다. 예를 들어 사용자가 세션당 2~3개의 게임 레벨을 완료하는 경우, 6~7개의 화면에 광고를 캐시하면 안 됩니다. 광고 가시성이 감소할 수 있으며, 광고 시스템이 앱의 우선순위를 낮출 수 있습니다.

앱에 적절한 균형을 찾을 수 있도록 파트너 인터페이스에서 "노출 비율" 또는 "가시적 노출 비율" 지표를 추적하세요. 20% 미만인 경우, 캐싱 알고리즘을 수정해야 할 가능성이 있습니다. 노출 비율이 높을수록 효과가 큽니다.

전체 코드 예시

using System;
using UnityEngine;
using UnityEngine.UI;
using YandexMobileAds;
using YandexMobileAds.Base;

public class YandexMobileAdsRewardedAdDemoScript : MonoBehaviour
{
    private RewardedAdLoader rewardedAdLoader;
    private RewardedAd rewardedAd;
    private Button button;

    private void Awake()
    {
        SetupLoader();
        RequestRewardedAd();
        DontDestroyOnLoad(gameObject);
        button.onClick.AddListener(ShowRewardedAd);
    }

    private void SetupLoader()
    {
        rewardedAdLoader = new RewardedAdLoader();
        rewardedAdLoader.OnAdLoaded += HandleAdLoaded;
        rewardedAdLoader.OnAdFailedToLoad += HandleAdFailedToLoad;
    }

    private void RequestRewardedAd()
    {
        string adUnitId = "demo-rewarded-yandex"; // "R-M-XXXXXX-Y"로 교체
        AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
        rewardedAdLoader.LoadAd(adRequestConfiguration);
    }

    private void ShowRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Show();
        }
    }

    public void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
    {
        // 광고가 성공적으로 로드되었습니다. 이제 처리할 수 있습니다.
        rewardedAd = args.RewardedAd;

        // 광고 동작에 대한 이벤트 처리기 추가
        rewardedAd.OnAdClicked += HandleAdClicked;
        rewardedAd.OnAdShown += HandleAdShown;
        rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
        rewardedAd.OnAdImpression += HandleImpression;
        rewardedAd.OnAdDismissed += HandleAdDismissed;
        rewardedAd.OnRewarded += HandleRewarded;
    }

    public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        // 광고 {args.AdUnitId}(이)가 {args.Message}와(과) 함께 로드에 실패함
        // OnAdFailedToLoad 이벤트에서 새 광고를 로드하려는 시도는 권장되지 않습니다.
    }

    public void HandleAdDismissed(object sender, EventArgs args)
    {
        // 광고가 해제되었을 때 호출됩니다.

        // 광고 해제 후 리소스를 정리합니다.
        DestroyRewardedAd();

        // 이제 다음 보상형 광고를 미리 로드할 수 있습니다.
        RequestRewardedAd();
    }

    public void HandleAdFailedToShow(object sender, AdFailureEventArgs args)
    {
        // 보상형 광고를 표시하는 데 실패했을 때 호출됩니다.

        // 광고 해제 후 리소스를 정리합니다.
        DestroyRewardedAd();

        // 이제 다음 보상형 광고를 미리 로드할 수 있습니다.
        RequestRewardedAd();
    }

    public void HandleAdClicked(object sender, EventArgs args)
    {
        // 광고에 대한 클릭이 기록될 때 호출됩니다.
    }

    public void HandleAdShown(object sender, EventArgs args)
    {
        // 광고가 표시될 때 호출됩니다.
    }

    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // 광고에 대한 노출이 기록될 때 호출됩니다.
    }

    public void HandleRewarded(object sender, Reward args)
    {
        // 사용자가 {args.type} 및 {args.amount}을 보상받을 수 있을 때 호출됩니다.
    }

    public void DestroyRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
    }
}

추가 리소스