본문 바로가기

미스터리 던전 (Mystery Dungeon)

iOS 유니티 애드(Unity Ads) 적용

  • Unity Ver: Unity 2021.3.9f1
  • Unity Ad Ver: 3.7.5
  • Xcode Ver: 14.1 (14B47b)

삽질에 삽질 끝에 앱에서 유니티 애드로 광고를 나오게 구현했다. 단순 광고 보여주는 기능이다. 보상과 연동되는 광고는 아니다. 라이브러리 갖다 쓰는 건데 왜 한큐에 매끄럽게 적용하지 못했을까.

유니티 애드 외 다른 패키지(Mediation)를 무심코 함께 설치하면서 프로젝트 설정들이 오염됐고 그 과정에서 착각을 했다. 유니티 애드를 추가하면 iOS 빌드 시 pod 관련 패키지가 추가되는 줄 알았다. Mediation 설치 시, 관련 패키지들이 추가되었고 워크스페이스도 추가되었기 때문이다. 사실 이 과정에서 pod 1.11의 지역화된 파일 이름 관련 오류가 발생했다. 이를 해결하기 위해 설치된 pod을 1.10 버전으로 낮췄다. 또 CocoaPods에 UnityAds 패키지가 있다는 것을 알게 됐다. 이 때부터 pod 패키지로 유니티 애드가 적용되어야 된다는 착각에 사로잡혔다.
Mediation을 프로젝트에서 제거 후 오직 유니티 애드만 적용해서 빌드했을 때, pod files 파일과 워크스페이스는 추가되지 않았다(당연한 결과다) 유니티 애드와 pod 관련 이슈에 대해서 계속 검색했다. pod 패기지 설치는 다양한 유니티 애드 튜토리얼 영상 또는 블로그에 전혀 언급되지 않았다.

결국 다시 처음으로 돌아가 샘플 프로젝트로 유니티 애드를 테스트 하기로 결정했다. 유니티 공식 웹사이트에서 제공하는 유니티 애드 튜토리얼(Get started with Unity Ads)을 차근차근 읽었다. 이 때, 유니티와 유니티 애드 버전에 따라 설정하는 법이 다르다는 사실을 알게 됐다.
UnityEngine.Advertisements를 사용하는 코드가 달랐던 것이다. 또 하나 빠트린 것은 유니티 대쉬보드 - Monetization에서 유니티 애드 적용 설정을 완료하지 않은 것이다. 그 결과, Ad unit에 대한 설정이 제대로 나오지 않았었다.
마지막으로 발생한 오류는 Advertisement.Load() 관련이었다. 튜토리얼에 나온 것처럼 다음과 같이 불러오면 초기화 전에 Load() 를 호출했다는 오류가 발생한다.

void Update()
{
    if (Advertisement.isInitialized && !adStarted)
    {
        Advertisement.Load(myAdUnitId);
        Advertisement.Show(myAdUnitId);
        adStarted = true;
    }
}


다음과 같이 초기화하면 Advertisement.Load()를 따로 호출할 필요가 없다.

// enablePerPlacementLoad: false
Advertisement.Initialize(m_gameId, m_testModeEnabled, false, this);


iOS에서 작동하는 최종 샘플 코드는 다음과 같다.

using UnityEngine;
using UnityEngine.Advertisements;

public class AdManager : MonoBehaviour, IUnityAdsInitializationListener
{
    [SerializeField] private string m_iOSGameId;
    [SerializeField] private bool m_testModeEnabled;

    private string m_gameId;
    private string m_adUnitIdIOS = "Interstitial_iOS";

    public void ShowAd()
    {
        if (Advertisement.IsReady())
        {
            Advertisement.Show(m_adUnitIdIOS);
            Debug.Log($"Show ad.");
        }
        else
        {
            Debug.Log($"Show ad - not ready");
        }
    }

    void IUnityAdsInitializationListener.OnInitializationComplete()
    {
        Debug.Log($"Ad initialization completed.");
    }

    void IUnityAdsInitializationListener.OnInitializationFailed(UnityAdsInitializationError error, string message)
    {
        Debug.Log($"Ad initialization failed. error:{error} message:{message}");
    }

    private void Awake()
    {
        m_gameId = m_iOSGameId;
        Advertisement.Initialize(m_gameId, m_testModeEnabled, false, this);
        Debug.Log($"Initialize ad. m_gameId:{m_gameId}");
    }
}


인터넷에 정보는 많지만, 현재 작업 환경(툴 버전, 패키지 버전)에 맞는 정보를 선별하는 것이 중요하다. 또한 API의 설정 옵션 또한 정확히 숙지할 필요가 있다.