다들 모바일 게임을 하다보면 덕지덕지 붙은 광고들을 볼 수 있을것이다. 뭐 게임 새로 시작하거나 다시하기 버튼 누를때마다 광고 나오는 그런 게임들 몇번 해봤을 것이다.
오늘의 포스팅은 Unity게임에 광고(Google AdMob) 붙이는 것이다. 유니티 자체적으로 지원하는 Unity Ads도 있다. 어떤것을 선택할지는 본인의 선택이다.
일단 구글AdMob에 가입하고 기본 설정을 해야한다.
나는 위 블로그를 참고하며 구글AdMob에 가입하며 설정을 했다. 솔직히 딱히 어려울 것 없는 과정이니 금방끝난다.
https://github.com/googleads/googleads-mobile-unity/releases
위 Github로 들어가서 플러그인을 다운 받아주면 된다.
동그라미 친 파일을 다운 받아주고 unity에서 Asset -> Import Package -> Custom Package로 해당 패키지를 import 한다.
Import하면 위와 같이 뜰 것이다.
구글플레이 플러그인을 적용까지 다 시킨 상태라면 위처럼 Google.VersionHandler.dll과 Google.VersionHandler.dll.mdb 파일은 꼭 import하지 말자.
오른쪽의 노란 경고창에 마우스를 올리면, 이미 존재하는 파일인데 덮어씌워도 되겠냐고 나온다.
README.md나 다른 파일들은 그냥 뭐 패치내역, 사용법 그런것들이어서 상관없었다. 하지만 위의 두 파일은 꼭 빼고 import 해주어야 한다고 한다. 사실 나도 다른 유튜브 보고 알게 되었다 ㅎㅎ. 저거 2개를 빼도 Google MobileAds는 잘 작동했다.
어쨋든 이렇게 import까지 다 끝내주고 Assets -> External Dependancy Manager -> Android Resolver -> Force Resolve 까지 해준다.
도중에 이상없나 빌드도 해봤는데
AndroidManifest.xml:41: AAPT: error: unexpected element <queries> found in <manifest>
이런 에러가 나오면서 빌드에 실패했다. 해결법은 간단했다.
Project Setting에 들어가서 Player->Publish Setting에서 Custom Base Gradle Template에 체크해주고
폴더중 Plugin->Android로 들어가서 baseProjectTemplate.gradle 파일을 킨다.
15번째 줄에 classpath의 마지막쯤에 3.4.0으로 되어있는걸 사진과 같이 3.4.3으로 바꿔주니까 해결되었다.
어쨋든 여기까지 했다면 모든 기본 설정은 마쳤다.
Asset -> Google Mobile Ads -> Setting를 누르면
인스펙터 창에 위와같이 뜬다. 원래 AppID는 각자 GoogleMobileAds 들어가면 확인 할 수 있다.
뭐 제대로 출시하기 전에 테스트하기 위함일 경우에 아래 샘플 ID를 사용하지 않으면 정책 위반에 걸린다는 얘기가 있다.
샘플 id : ca-app-pub-3940256099942544~3347511713
GoogleAD.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
public class GoogleAD : MonoBehaviour
{
private BannerView bannerView;
private InterstitialAd interstitial;//전면광고 객체
// Start is called before the first frame update
void Start()
{
MobileAds.Initialize(initStatus => {});//모바일 광고 SDK 초기화
/*
가끔 어떤 코드 보면 MobileAds.Initialize(appId); 이렇게 써 있다.
최신 버전에서는 지원 안하므로 위와 같이 해주자
*/
RequestInterstitial();
}
private void RequestInterstitial()//Interstitial은 전면광고라는 뜻이다. 전면광고를 요청하는 함수
{
string adUnitId="ca-app-pub-3940256099942544/1033173712";//전면광고 테스트 ID
this.interstitial=new InterstitialAd(adUnitId);//전면광고 초기화
this.interstitial.OnAdLoaded += HandleOnAdLoaded;// Called when an ad request has successfully loaded.
this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad; // 광고요청이 광고불러오는데 실패했을때 호출
this.interstitial.OnAdOpening += HandleOnAdOpening; // 광고가 켜졌을때 호출됨
this.interstitial.OnAdClosed += HandleOnAdClosed; //광고가 꺼졌을때 호출됨
AdRequest request=new AdRequest.Builder().Build();//Creat an empty ad request
this.interstitial.LoadAd(request);//request와 함께 전면광고를 호출
}
public void HandleOnAdLoaded(object sender, EventArgs args)
{
MonoBehaviour.print("HandleAdLoaded event received");
}
public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)//광고로드 실패했을때 원인분석용 함수
{
LoadAdError loadAdError = args.LoadAdError;
// Gets the domain from which the error came.
string domain = loadAdError.GetDomain();
// Gets the error code. See
// https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest
// and https://developers.google.com/admob/ios/api/reference/Enums/GADErrorCode
// for a list of possible codes.
int code = loadAdError.GetCode();
// Gets an error message.
// For example "Account not approved yet". See
// https://support.google.com/admob/answer/9905175 for explanations of
// common errors.
string message = loadAdError.GetMessage();
// Gets the cause of the error, if available.
AdError underlyingError = loadAdError.GetCause();
// All of this information is available via the error's toString() method.
Debug.Log("Load error string: " + loadAdError.ToString());
// Get response information, which may include results of mediation requests.
ResponseInfo responseInfo = loadAdError.GetResponseInfo();
Debug.Log("Response info: " + responseInfo.ToString());
}
public void HandleOnAdOpening(object sender, EventArgs args)
{
MonoBehaviour.print("HandleAdOpening event received");
}
public void HandleOnAdClosed(object sender, EventArgs args)
{
MonoBehaviour.print("HandleAdClosed event received");
}
public void GameOver()//게임오버가 되었을때 실행되게 구현
{
if(this.interstitial.IsLoaded())//광고로드가 완료되었다면
{
this.interstitial.Show();
}
}
}
위 코드에서 Handle어쩌고 함수안에는 원하는걸 작성하면된다.
예를 들어 HandleOnAdClosed(object sender, EventArgs args) 함수 안에
Application.Quit()함수를 넣으면 광고가 닫히면 어플리케이션이 꺼진다.
현재 위의 코드는 만약 광고를 불러내는데 실패하면 아래와 같이 Android Logcat에 에러 메세지가 나오게 구현했다.
글씨가 작아서 안보이겠지만, error code는 1이고 appId를 정확히 넣었느냐? 이런 에러 메세지가 나온다.
만약 본인이 잘 설정 한 거같은데 광고가 안 나오면 꼭 Build And Run해서 Android Logcat에서 에러메세지를 확인해보자.
또한 나는 전면광고를 넣을꺼여서 string adUnitId에 전면광고 테스트용 ID를 넣었다. 본인이 다른 광고를 테스트해보고 싶다면 그에 맞는 테스트 ID를 넣어야 한다. 다른 광고용 테스트 ID는 아래 링크에서 확인 가능하다.
https://developers.google.com/admob/unity/test-ads?hl=ko
어쨋든 나는 코드의 맨마지막 GameOver()함수를 GameOver된후 Main화면이나 Restart버튼을 누를 때마다 실행되게 했다. 즉 GameOver후 Main화면으로 나가려고 하거나 다시 시작하려고 한다면 꼭 전면광고를 보게 했다.
실행결과
'유니티' 카테고리의 다른 글
유니티 Update vs FixedUpdate (0) | 2022.11.06 |
---|---|
Unity PlayerPrefs 활용 (1) | 2022.10.14 |
유니티 구글플레이 리더보드 연동 (0) | 2022.09.19 |
유니티 네트워크 체크후 불안정하면 Android Alert Dialog띄우기 (1) | 2022.09.15 |
유니티로 안드로이드 Alert Dialog 띄우기 (0) | 2022.09.15 |