UNITY/Tool

[UNITY] Google Admob 간단 사용법

HYEOKJUN 2022. 2. 11. 18:00
반응형

앱 생성 및 프로덕션 출시

https://hyeokjunjjang.tistory.com/entry/UNITY-Google-Play-Game-Service-GPGS-%EA%B0%84%EB%8B%A8-%EC%82%AC%EC%9A%A9%EB%B2%95

[UNITY] Google Play Game Service (GPGS) 간단하지 않은 사용법

Google Play Console 기본 설정 https://play.google.com/console Google Play Console | Google Play Console Google Play Console로 앱과 게임을 게시 및 관리하고 Google Play에서 비즈니스를 성장시키세요...

hyeokjunjjang.tistory.com

위 링크를 참고하여 앱을 생성하고 프로덕션으로 출시합니다.


Google Admob 계정 생성 및 광고 단위 생성

https://admob.google.com/

Google AdMob: 모바일 앱 수익 창출

인앱 광고를 사용하여 모바일 앱에서 더 많은 수익을 창출하고, 사용이 간편한 도구를 통해 유용한 분석 정보를 얻고 앱을 성장시켜 보세요.

admob.google.com

위 링크에 접속하여 Admob 계정을 생성합니다.

[앱 > 앱 추가]를 클릭합니다.

플랫폼과 앱스토어 등록 여부를 선택합니다.

앱 이름, 개발자 이름, 패키지 이름, URL로 등록한 앱을 찾습니다.

( 앱을 아직 등록하지 않은 경우도 가능합니다. )

다음과 같이 앱이 추가되었습니다.

[광고 단위 > 시작하기]를 선택합니다.

원하는 광고 단위를 선택합니다.

다음과 같이 광고 단위를 생성합니다.
여서기 주의할 점이 있는데, 등록한 앱의 타깃층에게 적합한 광고를 게재해야 합니다. 이 사항을 준수하지 않으면 Google Play 정책 위반으로 앱 게시가 거부될 수 있습니다.

( 예를 들어, 전체 이용가 앱에는 폭력적이거나 선정적인 광고를 차단해야 합니다. )

광고 차단 관리를 위해서 [차단 관리]를 선택하고 [광고 콘텐츠 등급]을 클릭합니다.

타깃층에게 적합한 앱 수준 등급 한도를 설정합니다.

(아동용 앱이 아닌 전체 이용가 앱의 경우 PG가 적당합니다.)


Package 설치하기

https://developers.google.com/admob/unity

시작하기  |  Unity  |  Google Developers

Unity에서 앱을 제작 중인 AdMob 게시자를 위한 모바일 광고 SDK입니다.

developers.google.com

GoogleMobileAdmob Package를 설치하기 위해서 위 링크로 이동합니다.

[플러그인 다운로드]를 클릭합니다.

2022.02.09 기준

[GoogleMobileAds-v6.1.2.unitypackage]를 클릭하여 다운로드합니다.

GoogleMobileAdsImport할때 ExternalDependencyManager 폴더가 이미 존재하는 경우에는 체크를 해제한 후 Import합니다.

( 기존 폴더와 충돌을 일으킬 수 있습니다. )

[Assets > Google Mobile Ads > Setting]을 선택합니다.

[Google Mobile App ID]를 입력합니다.

( [Google Admob > 앱 > 앱 설정 > 앱 ID]를 복사해서 붙여 넣습니다. )


스크립트

AdmobManager.cs

(앱 오프닝 광고, 전면 광고, 보상형 광고)

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

public class AdmobManager : MonoBehaviour
{
	public static AdmobManager Instance; // 싱글톤을 구현합니다.

	void Awake() {
		if (Instance != null) {
			Destroy(gameObject);
		} else {
			Instance = this;
			DontDestroyOnLoad(gameObject);
		}
	}

	public const bool TESTMODE = true; // 앱이 프로덕션으로 게시되기 전에 테스트 광고 ID를 사용합니다.
	public const bool BLOCKAD = false; // 광고가 로드되지 않도록 합니다.

	void Start() {
		RequestConfiguration requestConfiguration = new RequestConfiguration
			.Builder()
			.SetTestDeviceIds(new List<string>() { "TEST DEVICE ID" }) // 테스트 디바이스 ID를 반드시 입력합니다. (프로덕션 출시시 이 줄을 삭제합니다.)
			.build();

		MobileAds.SetRequestConfiguration(requestConfiguration);

		if(!BLOCKAD) {
			LoadAppOpenAD();
			LoadInterstitialAD();
			LoadRewardedAD();
		}
	}

	#region AppOpenAD
    
	const string OPENINGAD_TEST_ID = "ca-app-pub-3940256099942544/3419835294";
	const string OPENINGAD_ID = ""; // 앱 오프닝 광고 ID를 입력합니다.
	AppOpenAd appOpenAd;

	private DateTime appOpenADLoadTime;
	private bool IsAppOpenADAvailable { get { return appOpenAd != null && (System.DateTime.UtcNow - appOpenADLoadTime).TotalHours < 4; } }
    
	private void LoadAppOpenAD() { // 앱 오프닝 광고를 로드합니다.
		if(IsAppOpenADAvailable) { return; }

		AdRequest request = new AdRequest.Builder().Build();
		AppOpenAd.LoadAd(TESTMODE ? OPENINGAD_TEST_ID : OPENINGAD_ID, ScreenOrientation.Portrait, request, (appOpenAd, error) => {
			this.appOpenAd = appOpenAd;
			this.appOpenADLoadTime = DateTime.UtcNow;
		});
	}

	public void ShowAppOpenAD() { // 앱 오프닝 광고를 표시합니다. (앱 실행시 최초 한번)
		if(!BLOCKAD && IsAppOpenADAvailable) { 
			appOpenAd.Show();
		}
	}

	#endregion

	#region InterstitialAD

	const string INTERSTITIALAD_TEST_ID = "ca-app-pub-3940256099942544/1033173712";
	const string INTERSTITIALAD_ID = ""; // 전면 광고 ID를 입력합니다.
	InterstitialAd interstitialAD;
	Action<bool> interstitialAD_callback;

	private void LoadInterstitialAD() { // 전면 광고를 로드합니다.
    	this.interstitialAD = new InterstitialAd(TESTMODE ? INTERSTITIALAD_TEST_ID : INTERSTITIALAD_ID);
		this.interstitialAD.LoadAd(new AdRequest.Builder().Build());

		this.interstitialAD.OnAdFailedToLoad += (sender, args) => { interstitialAD_callback?.Invoke(false); };
		this.interstitialAD.OnAdClosed += (sender, args) => { interstitialAD_callback?.Invoke(true); LoadInterstitialAD(); };
	}
	
	public void ShowIntersititialAD(Action<bool> callback = null) { // 전면 광고를 표시합니다. (콜백 함수를 등록할 수 있습니다.)
		this.interstitialAD_callback = callback;

		if(!BLOCKAD && this.interstitialAD.IsLoaded()) {
			this.interstitialAD.Show();
		} else {
			interstitialAD_callback?.Invoke(false);
		}
	}

	#endregion

	#region RewardedAD

	const string REWARD_TEST_ID = "ca-app-pub-3940256099942544/5224354917";
	const string REWARD_ID = ""; // 보상형 광고 ID를 입력합니다.
	RewardedAd rewardedAD;
	Action<bool> rewardedAD_callback;
    
	private void LoadRewardedAD() { // 보상형 광고를 로드합니다.
		this.rewardedAD = new RewardedAd(TESTMODE ? REWARD_TEST_ID : REWARD_ID);
		this.rewardedAD.LoadAd(new AdRequest.Builder().Build());

		this.rewardedAD.OnAdFailedToLoad += (sender, args) => { StartCoroutine(ExcuteRewardMethod(false)); };
		this.rewardedAD.OnAdFailedToShow += (sender, args) => { StartCoroutine(ExcuteRewardMethod(false)); };
		this.rewardedAD.OnUserEarnedReward += (sender, args) => { StartCoroutine(ExcuteRewardMethod(true)); };
		this.rewardedAD.OnAdClosed += (sender, args) => { LoadRewardedAD(); };
	}
    
	public void ShowRewardedAD(Action<bool> callback = null) { // 보상형 광고를 표시합니다. (콜백 함수를 등록할 수 있습니다.)
		this.rewardedAD_callback = callback;

		if(!BLOCKAD && this.rewardedAD.IsLoaded()) {
			this.rewardedAD.Show();
		} else {
			rewardedAD_callback?.Invoke(false);
		}
	}

	IEnumerator ExcuteRewardMethod(bool success) { // 보상형 광고의 콜백 함수를 실행합니다.
		yield return null;

		rewardedAD_callback?.Invoke(success);
	}

	#endregion
}

광고를 게시할 때 다음과 같이 사용합니다.

사용법

public void ShowAppOpenAD() { // 앱 오프닝 광고를 게재합니다. (앱 최소 실행시에만 작동하도록 구현합니다.)
	AdmobManager.Instance.ShowAppOpenAD();
}

public void ShowIntersititialAD() { // 전면 광고를 게재합니다.
	AdmobManager.Instance.ShowIntersititialAD((success) => {
		if(success) {
			// 광고 게재 성공시
		} else {
			// 광고 게재 실패시
		}
	});
}

public void ShowRewardedAD() { // 보상형 광고를 게재합니다.
	AdmobManager.Instance.ShowRewardAD((success) => {
		if(success) {
			// 광고 리워드 획득시
		} else {
			// 광고 게재 또는 리워드 획득 실패시
		}
	});
}

반응형