본문 바로가기

Unity

Unity에 Firebase 연동하고 Admob 설정하기 (2)

이제 Admob 홈페이지에 들어가서 어플리케이션을 추가하고, 광고단위를 생성하면된다.

 

https://admob.google.com/intl/ko/home/

 

Google AdMob: 모바일 앱 수익 창출

이제 막 시작한 경우에도, 어느 정도 궤도에 오른 경우에도 AdMob에서 미디에이션 그룹과 하우스 광고 캠페인, 직접 판매 캠페인 등 필요에 따라 확장 가능한 여러 기능을 활용하면 비즈니스를 성장시킬 수 있습니다.

admob.google.com

 

애드몹 홈페이지에서 어플리케이션과 광고단위를 추가했다면, 이제 유니티 프로젝트 내에 AdMob SDK를 추가해야한다.

아래의 홈페이지에 들어가서 최신버전을 다운받은 뒤, Asset>Import Package>Custom Package... 에서 선택하여 임포트 하면된다.

https://github.com/googleads/googleads-mobile-unity/releases

 

googleads/googleads-mobile-unity

Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity

github.com

다음으로, 유니티 프로젝트 내에서 설정해주어야 하는 부분이 있다.

Asset>Google Mobile Ads > Settings 에 들어가면 public값으로 Android용과 IOS용 appID를 입력할 수 있는 부분이 나온다. 이부분을 작성해주지 않으면 나중에 에러가 날 수도 있다고 하니 작성해주자!

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
using System;

public class AdMobMgr : GameFramework
{
    private InterstitialAd interstitial_ad;
    private RewardedAd rewarded_ad;

    public bool isTestMode = true;

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("start");
#if UNITY_ANDROID
        string appID = "ca-app-pub-6724985341208967~5561639679";
#elif UNITY_IPHONE
        string appID = "not defined";
#else
        string appID = "unexpected_platform";
#endif

        MobileAds.Initialize(appID);
        this.RequestInterstitial(); //전면광고 초기화
        this.RequestRewardedAd();   //보상형 광고 초기화
    }

  
    private void RequestInterstitial()
    {
        string adUnitId;
        //TODO 
        /*
#if UNITY_ANDROID
    adUnitId = "ca-app-pub-3940256099942544/1033173712";
#elif UNITY_IPHONE
    adUnitId = "";
#else
        adUnitId = "unexpected platform";
#endif

    */
        adUnitId = isTestMode ? ##이부분에 test광고id : ##이부분에 실제 광고단위id;

        this.interstitial_ad = new InterstitialAd(adUnitId);
        this.interstitial_ad.OnAdFailedToLoad += HandleOnAdFailedToLoad;
        this.interstitial_ad.OnAdClosed += HandleOnAdClosed;

        AdRequest request = new AdRequest.Builder().Build();
        this.interstitial_ad.LoadAd(request);
    }

   

    /// <summary>
    /// 전면광고 
    /// </summary>

    //광고가 닫혔을때, 메모리관리를 위해 destroy 후 다시 요청
    public void HandleOnAdClosed(object sender, EventArgs e)
    {

        interstitial_ad.Destroy();
        RequestInterstitial();
    }

    public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        Debug.Log("failed to load ad");
        //todo : 광고 로드에 실패했을 때 다른광고로드
    }

    //광고를 띄울때 사용하는 함수
    public void ShowInterstitial()
    {
        if (this.interstitial_ad.IsLoaded())
        {
            this.interstitial_ad.Show();
        }
        else
        {
            RequestInterstitial();
        }
    }


    /// <summary>
    /// 보상형 광고 
    /// </summary>
    /// 

    private void RequestRewardedAd()
    {
        string adUnitId;
        //TODO 
        /*
#if UNITY_ANDROID
    adUnitId = #광고단위 아이디";
#elif UNITY_IPHONE
    adUnitId = "";
#else
        adUnitId = "unexpected platform";
#endif

    */
       adUnitId = isTestMode ? ##이부분에 test광고id : ##이부분에 실제 광고단위id;

        this.rewarded_ad = new RewardedAd(adUnitId);

        this.rewarded_ad.OnAdFailedToLoad += HandleRewardedAdFailedToShow;
        this.rewarded_ad.OnAdClosed += HandleRewardedAdClosed;
        this.rewarded_ad.OnUserEarnedReward += HandleUserEarnedReward;

        AdRequest request = new AdRequest.Builder().Build();
        this.rewarded_ad.LoadAd(request);
    }

    public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
    {
        //todo : 에러났을때 다른광고 띄우는 것 구현
        
    }
    public void HandleRewardedAdClosed(object sender, EventArgs args)
    {
        RequestRewardedAd();
    }
    public void HandleUserEarnedReward(object sender, Reward args)
    {
        string type = args.Type;
        double amount = args.Amount;

        //todo : 보상설정
    }

    public void ShowRewardedAd()
    {
        if (this.rewarded_ad.IsLoaded())
        {
            this.rewarded_ad.Show();
        }
        else
        {
            RequestRewardedAd();
        }
    }

}

 

나의 경우에 필요한 광고는 전면광고와 리워드광고이다. 전면광고를 위한 Interstitial_ad 와, 리워드광고를 위한 rewarded_ad를 선언하였다.

RequestAd 함수의 경우 광고를 불러와 초기화하고 준비하는 함수이다.

UnitID는 admob에서 제공하는 광고단위 id를 적어야하는데, 안드로이드,ios에 따라 다르기떄문에 나누어서 설정해주었다. 광고가 닫히고나면 메모리를 절약하기 위해서 destroy를 해준뒤, 다시 초기화시켜준다.