Advertisement Legacy 구현
본 글에서는 연동하는 방법에 대해서는 다루지 않는다.
특별히 요구되는 부분은 많지 않다. 유니티에서 제공하는 간단한 예제를 사용하면 쉽게 유니티 광고를 프로젝트에 연결할 수 있다. 문제가 발생할 수 있는 부분만 설명한다.
아래의 링크를 참조한다.
2024.07.01 - [유니티/중급] - Unity Ads - Monetization 연동
1 Unity.Advertisements namespace
Advertisement Legacy와 관련된 클래스는 Unity.Advertisements 네임스페이스에 있다.
네임스페이스는 관련된 요소들을 포함하는 범위를 선언하는 데 사용하며, 관련된 클래스, 인터페이스 등을 사용하기 위해서는 선언을 해주어야 한다 [1].
- #using Unity.Adevertisements.
2 gameId
우선 프로젝트를 유니티 광고와 연결한다.
광고와 연결하기 위해서는 Unity Ads Monetization의 식별자가 필요하다. 식별자는 Game ID이다.
Unity Ads Monetization에서 자신이 연결하려고 하는 타겟 플랫폼의 gameId를 가져온다.
Unity Ads는 App store와 Andriod Store 두 개의 Game ID가 있다.
위치는 아래와 같다.
- Unity Ads Monetization → Settings → Game IDs
3. 초기화 및 연결
3.1 Advertisement.Initialize(string, bool, Interface)
유니티 광고 서버에 접속은 Advertisement의 Initialize를 사용하면 된다.
Insitialize를 통해 유니티 광고 서버에 성공적으로 접속을 하면, Scene을 변경할 때마다, Initialize를 할 필요는 없다. 앱이 종료할 때까지 계속 반복적으로 호출하지 않아도 접속은 유지된다.
- Advertisement.Initialize(string _gameId, bool testMode, IUnityAdsIntaliationLister interface)
전처리 지시문을 사용하여 안드로이드 스토어, 애플 스토어에 맞는 GameID를 설정한다.
#if UNITY_IOS
_gameId = _iOSGameId;
#elif UNITY_ANDROID
_gameId = _androidGameId;
3.2 IUnityAdsInitializationListener
유니티 광고 서버에 접속이 정상적으로 되었는지 확인하는 인터페이스를 구현한다.
유니티 광고 서버에 접속이 완료 후에 필요한 행동이 있다면, void OnInitializationComplete()에서 처리하는 로직을 구현한다.
using UnityEngine.Advertisements;
public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener
{
public void OnInitializationComplete()
{
Debug.Log("Unity Ads initialization complete.");
}
public void OnInitializationFailed(UnityAdsInitializationError error, string message)
{
Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
}
}
3.3 AdsInitialier Full Script
using UnityEngine;
using UnityEngine.Advertisements;
public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener
{
[SerializeField] string _androidGameId;
[SerializeField] string _iOSGameId;
[SerializeField] bool _testMode = true;
private string _gameId;
void Awake()
{
InitializeAds();
}
public void InitializeAds()
{
#if UNITY_IOS
_gameId = _iOSGameId;
#elif UNITY_ANDROID
_gameId = _androidGameId;
#elif UNITY_EDITOR
_gameId = _androidGameId; //Only for testing the functionality in the Editor
#endif
if (!Advertisement.isInitialized && Advertisement.isSupported)
{
Advertisement.Initialize(_gameId, _testMode, this);
}
}
public void OnInitializationComplete()
{
Debug.Log("Unity Ads initialization complete.");
}
public void OnInitializationFailed(UnityAdsInitializationError error, string message)
{
Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
}
}
코드 출처 [2]
4 Rewarded Ad
Rewarded Ad 광고를 사용하기 위해서는 앞선 1.2와 비슷하게 UnitID가 필요하다. 유니티 Dashboard의 Unity Ads Monetization의 Unit id를 등록한다.
- Unity Ads Monetization → Ad units
전처리 지시문을 사용하여 안드로이드 스토어, 애플 스토어에 맞는 UnitID를 설정한다.
#if UNITY_IOS
_adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
_adUnitId = _androidAdUnitId;
#endif
4.1 Advertisement.Load()
보상형 유니티 광고를 보여주기 전에, 광고를 로드한다.
Load가 정상적으로 완료가 되면, 광고가 재생가능한 상태가 된다. 광고가 재생 가능한지 상태인지 확인 및 이에 대한 처리는 IUnityAdsLoadListener 인터페이스를 등록하여 구현한다.
4.2 Advertisement.Show()
광고가 로드되었으면, 버튼을 활성화한다. 사용자 입력을 받아, 광고를 보여준다.
4.3 Full Script
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
public class RewardedAdsButton : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
[SerializeField] Button _showAdButton;
[SerializeField] string _androidAdUnitId = "Rewarded_Android";
[SerializeField] string _iOSAdUnitId = "Rewarded_iOS";
string _adUnitId = null; // This will remain null for unsupported platforms
void Awake()
{
// Get the Ad Unit ID for the current platform:
#if UNITY_IOS
_adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
_adUnitId = _androidAdUnitId;
#endif
// Disable the button until the ad is ready to show:
_showAdButton.interactable = false;
}
// Call this public method when you want to get an ad ready to show.
public void LoadAd()
{
// IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
Debug.Log("Loading Ad: " + _adUnitId);
Advertisement.Load(_adUnitId, this);
}
// If the ad successfully loads, add a listener to the button and enable it:
public void OnUnityAdsAdLoaded(string adUnitId)
{
Debug.Log("Ad Loaded: " + adUnitId);
if (adUnitId.Equals(_adUnitId))
{
// Configure the button to call the ShowAd() method when clicked:
_showAdButton.onClick.AddListener(ShowAd);
// Enable the button for users to click:
_showAdButton.interactable = true;
}
}
// Implement a method to execute when the user clicks the button:
public void ShowAd()
{
// Disable the button:
_showAdButton.interactable = false;
// Then show the ad:
Advertisement.Show(_adUnitId, this);
}
// Implement the Show Listener's OnUnityAdsShowComplete callback method to determine if the user gets a reward:
public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
{
if (adUnitId.Equals(_adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
{
Debug.Log("Unity Ads Rewarded Ad Completed");
// Grant a reward.
}
}
// Implement Load and Show Listener error callbacks:
public void OnUnityAdsFailedToLoad(string adUnitId, UnityAdsLoadError error, string message)
{
Debug.Log($"Error loading Ad Unit {adUnitId}: {error.ToString()} - {message}");
// Use the error details to determine whether to try to load another ad.
}
public void OnUnityAdsShowFailure(string adUnitId, UnityAdsShowError error, string message)
{
Debug.Log($"Error showing Ad Unit {adUnitId}: {error.ToString()} - {message}");
// Use the error details to determine whether to try to load another ad.
}
public void OnUnityAdsShowStart(string adUnitId) { }
public void OnUnityAdsShowClick(string adUnitId) { }
void OnDestroy()
{
// Clean up the button listeners:
_showAdButton.onClick.RemoveAllListeners();
}
}
코드 출처 [2]
5. interstitial Ad
4의 코드와 동일한 방식으로 구현된다.
단, interstitial에 맞는 UnitID가 사용된다.
아래 코드 출처 [2] 를 참조한다.
using UnityEngine;
using UnityEngine.Advertisements;
public class InterstitialAdExample : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
[SerializeField] string _androidAdUnitId = "Interstitial_Android";
[SerializeField] string _iOsAdUnitId = "Interstitial_iOS";
string _adUnitId;
void Awake()
{
// Get the Ad Unit ID for the current platform:
_adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
? _iOsAdUnitId
: _androidAdUnitId;
}
// Load content to the Ad Unit:
public void LoadAd()
{
// IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
Debug.Log("Loading Ad: " + _adUnitId);
Advertisement.Load(_adUnitId, this);
}
// Show the loaded content in the Ad Unit:
public void ShowAd()
{
// Note that if the ad content wasn't previously loaded, this method will fail
Debug.Log("Showing Ad: " + _adUnitId);
Advertisement.Show(_adUnitId, this);
}
// Implement Load Listener and Show Listener interface methods:
public void OnUnityAdsAdLoaded(string adUnitId)
{
// Optionally execute code if the Ad Unit successfully loads content.
}
public void OnUnityAdsFailedToLoad(string _adUnitId, UnityAdsLoadError error, string message)
{
Debug.Log($"Error loading Ad Unit: {_adUnitId} - {error.ToString()} - {message}");
// Optionally execute code if the Ad Unit fails to load, such as attempting to try again.
}
public void OnUnityAdsShowFailure(string _adUnitId, UnityAdsShowError error, string message)
{
Debug.Log($"Error showing Ad Unit {_adUnitId}: {error.ToString()} - {message}");
// Optionally execute code if the Ad Unit fails to show, such as loading another ad.
}
public void OnUnityAdsShowStart(string _adUnitId) { }
public void OnUnityAdsShowClick(string _adUnitId) { }
public void OnUnityAdsShowComplete(string _adUnitId, UnityAdsShowCompletionState showCompletionState) { }
}
코드 출처 [2]
6. Banner Ad
배너 광고는 UnitID가 필요하다.
위치는 아래와 같다.
- Unity Ads Monetization → Ad units
아래 코드 출처 [2] 를 참조한다.
6. 1 BannerPosition
6.1.1 Advertisement.Banner.SetPosition(BannerPosition)
SetPosition() 함수를 사용해 배너의 위치를 지정한다. 열거형을 사용하여, 배너의 위치를 설정한다.
- Advertisement.Banner.SetPosition (BannerPosition.TOP_CENTER);
6.1.1 열거형 BannerPosition
- BannerPosition.CENTER
- BannerPosition.TOP_CENTER
- BannerPosition.TOP_LEFT
- BannerPosition.TOP_RIGHT
- BannerPosition.BOTTOM_CENTER
- BannerPosition.BOTTOM_LEFT
- BannerPosition.BOTTOM_RIGHT
6.1 Advertisement.Banner.Load(string UnitId, BannerLoadOptions bannerLoadOptions)
배너를 로드한다. BannerLoadOptions class를 사용해 로드가 정상적으로 이루어졌는지 확인하는 콜백 함수를 등록한다. 등록한 콜백함수를 사용해 로드가 성공하였을 때의 로직, 실패하였을 때의 로직을 구현한다. 버튼을 클릭이 가능하도록 하는 코드를 작성한다.
6.2 Advertisement.Banner.Show(string UnitID, BannerOptions bannerOptions)
배너를 보여준다. BannerOptions class는 배너 클릭과 같은 이벤트가 발생하였을 때 상태 변화에 따른 처리를 담당하는 콜백 함수를 등록할 수 있다.
6.3 Advertisement.Banner.Hide()
배너를 보이지 않게 한다.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
public class BannerAdExample : MonoBehaviour
{
// For the purpose of this example, these buttons are for functionality testing:
[SerializeField] Button _loadBannerButton;
[SerializeField] Button _showBannerButton;
[SerializeField] Button _hideBannerButton;
[SerializeField] BannerPosition _bannerPosition = BannerPosition.BOTTOM_CENTER;
[SerializeField] string _androidAdUnitId = "Banner_Android";
[SerializeField] string _iOSAdUnitId = "Banner_iOS";
string _adUnitId = null; // This will remain null for unsupported platforms.
void Start()
{
// Get the Ad Unit ID for the current platform:
#if UNITY_IOS
_adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
_adUnitId = _androidAdUnitId;
#endif
// Disable the button until an ad is ready to show:
_showBannerButton.interactable = false;
_hideBannerButton.interactable = false;
// Set the banner position:
Advertisement.Banner.SetPosition(_bannerPosition);
// Configure the Load Banner button to call the LoadBanner() method when clicked:
_loadBannerButton.onClick.AddListener(LoadBanner);
_loadBannerButton.interactable = true;
}
// Implement a method to call when the Load Banner button is clicked:
public void LoadBanner()
{
// Set up options to notify the SDK of load events:
BannerLoadOptions options = new BannerLoadOptions
{
loadCallback = OnBannerLoaded,
errorCallback = OnBannerError
};
// Load the Ad Unit with banner content:
Advertisement.Banner.Load(_adUnitId, options);
}
// Implement code to execute when the loadCallback event triggers:
void OnBannerLoaded()
{
Debug.Log("Banner loaded");
// Configure the Show Banner button to call the ShowBannerAd() method when clicked:
_showBannerButton.onClick.AddListener(ShowBannerAd);
// Configure the Hide Banner button to call the HideBannerAd() method when clicked:
_hideBannerButton.onClick.AddListener(HideBannerAd);
// Enable both buttons:
_showBannerButton.interactable = true;
_hideBannerButton.interactable = true;
}
// Implement code to execute when the load errorCallback event triggers:
void OnBannerError(string message)
{
Debug.Log($"Banner Error: {message}");
// Optionally execute additional code, such as attempting to load another ad.
}
// Implement a method to call when the Show Banner button is clicked:
void ShowBannerAd()
{
// Set up options to notify the SDK of show events:
BannerOptions options = new BannerOptions
{
clickCallback = OnBannerClicked,
hideCallback = OnBannerHidden,
showCallback = OnBannerShown
};
// Show the loaded Banner Ad Unit:
Advertisement.Banner.Show(_adUnitId, options);
}
// Implement a method to call when the Hide Banner button is clicked:
void HideBannerAd()
{
// Hide the banner:
Advertisement.Banner.Hide();
}
void OnBannerClicked() { }
void OnBannerShown() { }
void OnBannerHidden() { }
void OnDestroy()
{
// Clean up the listeners:
_loadBannerButton.onClick.RemoveAllListeners();
_showBannerButton.onClick.RemoveAllListeners();
_hideBannerButton.onClick.RemoveAllListeners();
}
}
코드 출처 [2]
5. Advertisement Legacy Error
Advertisement legacy를 설치하는 과정에서 오류가 발생할 수 있다.
아래의 글을 참조한다.
2025.01.27 - [유니티/중급] - Unity Resolving Android Dependencies
reference
[1] https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/namespace
[2] 코드 출처. https://docs.unity.com/ads/en-us/manual/InitializingTheUnitySDK
'유니티 > 중급' 카테고리의 다른 글
Unity Resolving Android Dependencies (0) | 2025.01.29 |
---|---|
Unity Ads - Monetization 연동 (0) | 2025.01.29 |
유니티 JSON 파일 저장 및 불러오기(2) (0) | 2021.01.23 |
유니티 JSON 파일 저장 및 불러오기(1) (0) | 2021.01.23 |
유니티 스크립터블 오브젝트( ScriptableObject ) (0) | 2021.01.05 |