앱 생성 및 프로덕션 출시
위 링크를 참고하여 앱을 생성하고 프로덕션으로 출시합니다.
Google Admob 계정 생성 및 광고 단위 생성
위 링크에 접속하여 Admob 계정을 생성합니다.
[앱 > 앱 추가]를 클릭합니다.
플랫폼과 앱스토어 등록 여부를 선택합니다.
앱 이름, 개발자 이름, 패키지 이름, URL로 등록한 앱을 찾습니다.
( 앱을 아직 등록하지 않은 경우도 가능합니다. )
다음과 같이 앱이 추가되었습니다.
[광고 단위 > 시작하기]를 선택합니다.
원하는 광고 단위를 선택합니다.
다음과 같이 광고 단위를 생성합니다.
여서기 주의할 점이 있는데, 등록한 앱의 타깃층에게 적합한 광고를 게재해야 합니다. 이 사항을 준수하지 않으면 Google Play 정책 위반으로 앱 게시가 거부될 수 있습니다.
( 예를 들어, 전체 이용가 앱에는 폭력적이거나 선정적인 광고를 차단해야 합니다. )
광고 차단 관리를 위해서 [차단 관리]를 선택하고 [광고 콘텐츠 등급]을 클릭합니다.
타깃층에게 적합한 앱 수준 등급 한도를 설정합니다.
(아동용 앱이 아닌 전체 이용가 앱의 경우 PG가 적당합니다.)
Package 설치하기
https://developers.google.com/admob/unity
GoogleMobileAdmob Package를 설치하기 위해서 위 링크로 이동합니다.
[플러그인 다운로드]를 클릭합니다.
[GoogleMobileAds-v6.1.2.unitypackage]를 클릭하여 다운로드합니다.
GoogleMobileAds를 Import할때 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 {
// 광고 게재 또는 리워드 획득 실패시
}
});
}