유니티 앱에서 수익 극대화를 위해 가장 많이 사용되는 광고 플랫폼은 구글 애드몹입니다. 애드몹은 광고주와 콘텐츠 소비자를 기준으로 광고주의 최대 이익과 정보 소비자의 원활한 콘텐츠 소모를 위해 정책이 엄격하여 정책 위반 시 가볍게는 등록된 콘텐츠의 광고 게재 정지나 계정 정지까지 가능하니 사용 전 관련 정책 확인이 필요합니다. 이번 포스팅에서는 유니티 앱으로 애드몹에서 수익창출을 하기 위해 많이 사용되는 전면과 보상형 광고의 구현 방법에 대해 설명합니다.
이 튜토리얼은 2022년 9월 3일에 작성 및 테스트하였습니다.
1. 애드몹 SDK 설치
애드몹 유니티 가이드 링크에 기재된 "플러그인 다운"을 통해 애드몹 github으로 이동하여 UnityMobileAds 패키지를 다운로드합니다. 설치할 프로젝트를 열어놓고 내려받은 package 파일을 열어 설치합니다. 설치 시 추가로 External Dependency Manager도 같이 설치되는데 이 패키지는 Android와 iOS의 종속성을 해결 및 버전을 관리해주는 플러그인입니다. 패키지를 Install 하면 External Dependency Manager의 자동 의존성 체크 팝업이 뜨는데 "Yes"를 클릭합니다.
2. Scene 구성
전체 UI오브젝트로 구성되어 있습니다. 파란 화살표는 해당 UI 오브젝트와 연결되어 있는 하이어 라키의 게임 오브젝트를 가리키고 빨간 화살표는 스크립트가 컴포넌트로 추가된 게임 오브젝트를 가리킵니다. UI 요소로 GoldText는 보상형 광고 완료 후 보상이 지급되는지 보기 위한 텍스트이고 버튼은 전면과 보상형 광고를 각각 2개가 존재합니다.
3. 스크립트 구성
GoogleMobileAdsDemoScript.cs (전면 + 보상형 광고)
구글 가이드에서 제공하는 코드는 별도로 되어있지만 하나의 스크립트로 작성했습니다.
▶ GoogleMobileAdsDemoScript.cs
전면 광고는 버튼으로 실행되는지 확인하고 보상형 광고는 시청 완료 시 gold 100을 제공하는 코드입니다. 전체를 보면 각 광고는 로드하는 함수, 송출하는 함수, 그리고 이과정에서 발생하는 이벤트에 연결된 함수로 이루어져 있습니다. 가이드에서 이야기하는 특이점은 광고에 사용되는 InterstitialAd와 RewardedAd 인스턴스는 재활용이 불가능하다고 표기되어있습니다. 또한 InterstitalAd 객체는 로드 전에 Destroy함수로 인스턴스를 파괴해야 점유 메모리가 반환된 다고 설명되어 있기에 주의를 요합니다. 코드의 자세한 내용은 주석으로 설명되어있습니다.
using System;
using UnityEngine;
using UnityEngine.UI;
using GoogleMobileAds.Api;
public class GoogleMobileAdsDemoScript : MonoBehaviour
{
[Header("보상형 광고 테스트용 골드")]
public int gold = 100;
[Header("골드 디스플레이용 텍스트")]
public Text goldText;
void Start()
{
DisplayGold();
//구글 모바일애즈 SDK 초기화
MobileAds.Initialize(initStatus => { });
//광고별 초기 로드
LoadInterstitialAd();
LoadRewardedAd();
}
void DisplayGold(){goldText.text = gold.ToString();}
#region 전면광고
private InterstitialAd interstitialAd;
private void LoadInterstitialAd() // 전면광고 로드 함수
{
// 애드몹 에서 제공하는 테스트 ID
#if UNITY_ANDROID
string adUnitId = "ca-app-pub-3940256099942544/1033173712";
#elif UNITY_IPHONE
string adUnitId = "ca-app-pub-3940256099942544/4411468910";
#else
string adUnitId = "unexpected_platform";
#endif
// 광고단위 ID로 InterstitialAd 객체를 생성
this.interstitialAd = new InterstitialAd(adUnitId);
// interstitialAd에서 발생하는 콜백 delegate에 함수등록
this.interstitialAd.OnAdLoaded += HandleOnAdLoaded;
this.interstitialAd.OnAdFailedToLoad += HandleOnAdFailedToLoad;
this.interstitialAd.OnAdOpening += HandleOnAdOpening;
this.interstitialAd.OnAdClosed += HandleOnAdClosed;
// 빈 광고 요청을 만들어 광고로드의 인자로 넘겨준다.
AdRequest request = new AdRequest.Builder().Build();
this.interstitialAd.LoadAd(request);
}
public void HandleOnAdLoaded(object sender, EventArgs args)
{
// 전면광고 로드 완료 시 실행될 코드 삽입
}
public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
// 전면광고 로드 실패 시 실행 될 코드 삽입
}
public void HandleOnAdOpening(object sender, EventArgs args)
{
// 전면광고 시작 시 실행 될 코드 삽입
}
public void HandleOnAdClosed(object sender, EventArgs args)
{
// 사용자가 닫기 아이콘을 탭하거나 뒤로 버튼을
// 사용하여 보상형 동영상 광고를 닫을 때 실행
// 한번 사용된 InterstitialAd 재사용이 불가
// 메모리 반환을 위해 Object를 Destroy
interstitialAd.Destroy();
LoadInterstitialAd();
}
public void ShowInterstitialAd()
{
//광고가 로드되어있으면 광고를 보여준다.
if(interstitialAd.IsLoaded())
interstitialAd.Show(); // 광고송출 트리거
}
#endregion
#region 보상형 광고
private RewardedAd rewardedAd;
public void LoadRewardedAd() // 보상형 광고 로드 함수
{
// 애드몹 에서 제공하는 테스트 ID
string adUnitId;
#if UNITY_ANDROID
adUnitId = "ca-app-pub-3940256099942544/5224354917";
#elif UNITY_IPHONE
adUnitId = "ca-app-pub-3940256099942544/1712485313";
#else
adUnitId = "unexpected_platform";
#endif
// 광고단위 ID로 RewardedAd 객체를 생성
this.rewardedAd = new RewardedAd(adUnitId);
// interstitialAd에서 발생하는 콜백 delegate에 함수등록
this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;
// 빈 광고 요청을 만들어 광고로드의 인자로 넘겨준다.
AdRequest request = new AdRequest.Builder().Build();
this.rewardedAd.LoadAd(request);
}
public void HandleRewardedAdLoaded(object sender, EventArgs args)
{
// 보상형광고 로드 완료 시 실행될 코드 삽입
}
public void HandleRewardedAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
// 보상형광고 로드 실패 시 실행될 코드 삽입
}
public void HandleRewardedAdOpening(object sender, EventArgs args)
{
// 보상형광고 시작 시 실행될 코드 삽입
}
public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
{
// 보상형광고 송출 실패 시 실행될 코드 삽입
}
public void HandleRewardedAdClosed(object sender, EventArgs args)
{
// 사용자가 닫기 아이콘을 탭하거나 뒤로 버튼을
// 사용하여 보상형 동영상 광고를 닫을 때 실행
}
public void HandleUserEarnedReward(object sender, Reward args)
{
// 사용자가 받을 보상 코드 삽입
// 골드를 100 제공하고 골드 디스플레이를 갱신한다.
gold += 100; DisplayGold();
}
public void ShowRewardedAd()
{
// 광고가 로드 되어있다면 광고를 보여준다.
if(rewardedAd.IsLoaded())
rewardedAd.Show();
// 광고를 보여주고 다음광고를 로드한다.
LoadRewardedAd();
}
#endregion
}
전면광고와 보상형 광고 이벤트에 대한 자세한 설명은 가이드 페이지를 통해 확인하시면 됩니다.
4. 하이어 라키 참조 하기
GoogleMobileAdsDemoScript의 컨포넌트에 GoldText 참조와 각 광고 버튼에 Show 함수를 연결합니다.
5. 실행결과
에디터에서 실행했을 때 정상 작동을 확인하였습니다. 기존에 작성했던 유니티 애즈 통합 방법과 마찬가지로 광고 구성 후 빌드 테스트는 해보는 것을 추천합니다. 테스트 전에 가이드 페이지에서 "테스트 광고 사용 설정"을 참고하세요.
6. 주의사항
애드몹 가이드 사이트를 통해 주의사항이나 권장사항, 테스트 관련 주의사항 등 애드몹 정책 관련 부분을 확인하여야 합니다. 이러한 정책을 무시하고 구현하면 정책 위반으로 광고 정지나 게 제제한에 걸릴 수 있습니다.
'유니티 이야기' 카테고리의 다른 글
[Unity] 프로그래밍에 쉽게 입문하는 방법 (0) | 2022.09.05 |
---|---|
[Unity] 구글 시트에서 데이터 읽어오기 (0) | 2022.09.04 |
[Unity] 간단한 머지 게임 만들기 (1) | 2022.09.02 |
[Unity] UI Object Drag 하는 방법 (0) | 2022.09.01 |
[Unity] 2022 유니티 Ads Tutorial (1) | 2022.08.31 |
댓글