Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Все Гайды Мой Кабинет

Как подключить рекламу в Unity Ads

Приветствую! Наверное каждый разработчик игр, рано или поздно задумывается о том, чтобы начать зарабатывать деньги на своей игре с помощью рекламы. И в данной статье мы пошагово разберём подключение рекламы с помощью Unity Ads.

Подключение монетизации состоит из нескольких очень простых шагов, и начнём мы свой пусть с создания игрового ID. Но если для своего проекта вы уже создали уникальный ID, то данный пункт можете пропустить.

Создание ID проекта

Каждый проект должен иметь собственный уникальный ID, и поэтому сейчас нам его необходимо создать. Для этого откроем окно Project Settings (вкладка Edit - Project Settings...), и в разделе Services в поле Organizations выбираем свою организацию, которая автоматически создалась после регистрации на юнити, и потом жмём кнопку Create project ID.

Далее подгрузится новое окошко, в котором нужно указать, является ли данная игра, детской, до 13 лет? Если нет, то указываем No, и жмём кнопку Save.

Поздравляем, ID для вашего проекта создан, и теперь можно переходить к подключению рекламного модуля Unity Ads.

Подключение Unity Ads

Пришло время для подключения специального модуля, который отвечает за рекламу. Для этого, в этом же окне Project Settings перейдите в раздел Ads, и нажмите на кнопку OFF, которая сразу же превратится в ON. Чуть ниже, необходимо нажать на кнопку Install Latest Version, для обновления новой версии рекламного пакета. В итоге, в поле Current Version должна быть такая же версия пакета, которая указана в поле Latest Version Avaliable.

ВАЖНО: при обновлении пакета может произойти внутренний конфликт и выскочить диалоговое окно, которое предложит удалить данный пакет, либо пропустить. Обязательно необходимо пропустить!

Так же в поле Enable test mode поставьте галочку, чтобы реклама работала в тестовом режиме. Как только ваша игра будет полностью завершена, то перед билдом эту галочку нужно будет ОБЯЗАТЕЛЬНО снять!

Поздравляем, мы только что подключили Unity Ads, который в свою очередь сгенерировал для нас игровой ID для нашей игры, и он кстати говоря разный для Android и для iOS. Значения этих ID можно видеть не только на скриншоте выше, но и в своём личном кабинете на сайте unity. Данные ID чуть позже нам пригодятся для скриптов.

Настройка монетизации

Пришло время для настройки монетизации. А настраивать её мы будем в личном кабинете Unity. Для этого откроем окно Services, с помощью вкладки Window - General - Services. Данное окно откроется с правой стороны юнити, и жмём в ней на Dashboard.

Далее вас перенаправит на личный кабинет, в котором необходимо выбрать раздел Monetization и нажать на кнопку Set Mediation Partner, для указания рекламного посредника.

После нажатия на кнопку, вам необходимо выбрать способ монетизации. Выбираем самый первый способ I Don't plan to use Mediation, only Unity Ads, чтобы указать, что мы не хотим работать с посредниками, а только напрямую с Unity, и жмём OK.

После чего нас перекинет в подраздел Ad Units, в котором мы можем увидеть наши ID для игр Android и iOS, а так же 6 созданных видов реклам, вместе с их id:

  • Interstitial - реклама, которую игрок может пропустить.
  • Rewarded - реклама, которую нельзя пропустить. Обычно за просмотр такой рекламы, игроку начисляются какие-нибудь бонусы.
  • Banner - баннер, который постоянно висит на экране. Он почти никогда не используется, из-за экономия места экрана телефона.

Отлично, монетизация подключена, теперь осталась завершающая часть, вызов нашей рекламы в игре с помощью скриптов.

Скрипты

Всё это время мы проводили можно сказать подготовительную работу, а сейчас перейдём непосредственно к скриптам, чтобы вызывать нашу рекламу, и отображать её игрокам. И первым делом необходимо в окне Hierarchy создать пустой объект, назовём его Ads, который нужен исключительно для работы наших рекламных скриптов.

Инициализация рекламы

Далее создадим i[iC# скрипт с названием AdsInitializer. Данный скрипт самый важный. Он будет инициализатором, то-есть он будет создавать подключения к рекламной сети Unity Ads. Заранее присвоим его к только что созданному объекту Ads, и впишем в данный скрипт следующий код:

using UnityEngine;
using UnityEngine.Advertisements;

public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener
{
    [SerializeField] string androidGameID = "5061567";
    [SerializeField] string iOSGameID = "5061566";
    [SerializeField] bool testMode = true;
    private string gameID;

    private void Awake()
    {
        gameID = (Application.platform == RuntimePlatform.IPhonePlayer) ? iOSGameID : androidGameID;
        Advertisement.Initialize(gameID, testMode, this);
    }


    public void OnInitializationComplete()
    {
        Debug.Log("Инициализация прошла успешно.");
    }

    public void OnInitializationFailed(UnityAdsInitializationError error, string message)
    {
        Debug.Log($"Ошибка инициализации: {error.ToString()} - {message}");
    }

}

Вкратце разберём код:

  • В строке #2 мы подключаем библиотеку UnityEngine.Advertisements, так как работаем с рекламой. А чуть ниже наследуем итерфейс IUnityAdsInitializationListener.
  • В строках #6-7 мы создали переменные, в которые необходимо занести ID нашей игры для андройда и айфона.
  • В строке #8 мы укажем, что реклама должна отображаться в тестовом режиме. При завершении разработки игры, необходимо изменить данное значение на false.
  • В методе Awake() мы проверяем устройство игрока, если это айфон, то в переменную gameID заносим ID айфона, иначе в данную переменную заносим ID андройда.
  • Ну а в строке #14, с помощью метода Initialize() мы проводим подключение к рекламной сети. Если подключение прошло успешно, то вызывается метод OnInitializationComplete(), а если произошла ошибка, то вызывается метод OnInitializationFailed().

На этом этапе можете запустить игру. Если вы всё сделали правильно, то в консоле можете видеть сообщение об успешной инициализации. А если нет - то сообщение об ошибке инициализации.

Реклама Interstitial

Создадим C# скрипт, с названием InterstitialAds, который будет отображать стандартную рекламу типа Interstitial. Заранее присвоим этот скрипт объекту Ads, и впишем в него следующий код:

using UnityEngine;
using UnityEngine.Advertisements;

public class InterstitialAds : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
    [SerializeField] string androidAdID = "Interstitial_Android";
    [SerializeField] string iOSAdID = "Interstitial_iOS";
    private string adID;

    private void Awake()
    {
        adID = (Application.platform == RuntimePlatform.IPhonePlayer) ? iOSAdID : androidAdID;
    }

    public void ShowAd()
    {
        Advertisement.Load(adID, this);
        Advertisement.Show(adID, this);
    }

    public void OnUnityAdsAdLoaded(string placementId)
    {
        Debug.Log("Реклама загружена: " + placementId);
    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {
        Debug.Log($"Ошибка загрузки рекламы: {error.ToString()} - {message}");
    }

    public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
    {
        Debug.Log($"Ошибка показа рекламы: {error.ToString()} - {message}");
    }

    public void OnUnityAdsShowStart(string placementId)
    {
        Debug.Log("Старт показа реклама: " + placementId);
    }

    public void OnUnityAdsShowClick(string placementId)
    {
        Debug.Log("клик по рекламе: " + placementId);
    }

    public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
    {
        Debug.Log("Юнити завершил показ рекламы.");
    }

}

Разбирать данный скрипт мы не будем, поскольку он очень похож на предыдущий. То-есть, здесь так же создаём переменные для Android и iOS, и определяем устройство пользователя. Здесь так же имеется 6 обработчиков событий, которые в консоль заносят различные уведомления.

Важно! Единственное на что хотелось бы обратить внимание, это на метод ShowAd(), который сначала с помощью метода Load() подгружает рекламу, а потом с помощью метода Show() отображает её на экране для пользователя. Именно этот метод и нужно вызывать тогда, когда вам необходимо отобразить рекламу на игровой сцене. Например вызов данного метода можно произвести сразу после нажатия на определённую кнопку.

Реклама Rewarded

Создадим C# скрипт с названием RewardedAds, который будет вызывать рекламу типа Rewarded - которую нельзя пропустить, и за которую обычно игроку даются какие-либо бонусы. Присвойте его объекту Ads, и впишите в него следующий код:

using UnityEngine;
using UnityEngine.Advertisements;

public class RewardedAds : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
    [SerializeField] string androidAdID = "Rewarded_Android";
    [SerializeField] string iOSAdID = "Rewarded_iOS";
    private string adID;

    private void Awake()
    {
        adID = (Application.platform == RuntimePlatform.IPhonePlayer) ? iOSAdID : androidAdID;
    }

    public void ShowAd()
    {
        Advertisement.Load(adID, this);
        Advertisement.Show(adID, this);
    }

    public void OnUnityAdsAdLoaded(string placementId)
    {
        Debug.Log("Реклама загружена: " + placementId);
    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {
        Debug.Log($"Ошибка загрузки рекламы: {error.ToString()} - {message}");
    }

    public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
    {
        Debug.Log($"Ошибка показа рекламы: {error.ToString()} - {message}");
    }

    public void OnUnityAdsShowStart(string placementId)
    {
        Debug.Log("Старт показа реклама: " + placementId);
    }

    public void OnUnityAdsShowClick(string placementId)
    {
        Debug.Log("клик по рекламе: " + placementId);
    }

    public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
    {
        if (showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
        {
            // тут код для добавления бонусов игроку.
            Debug.Log("Юнити завершил показ рекламы, и добавил бонусы игроку.");
        }
    }

}

Как видите, код почти такой же, как и предыдущий. Вызов рекламы так же создаётся при помощи метода ShowAd(). Единственное, на что хотелось бы обратить внимание, это на метод OnUnityAdsShowComplete() в строке #46. Здесь мы можем дописать код, который будет добавлять различные бонусы за просмотр рекламы.

Реклама Banner

Создадим C# скрипт с названием BannerAd, который будет вызывать рекламу типа Banner - которая отображается всегда, где-нибудь сбоку экрана. Такую рекламу используют очень редко, поскольку она занимает достаточно много места на экране, и мешает самой игре. Присвойте данный скрипт объекту Ads, и впишите в него следующий код:

using UnityEngine;
using UnityEngine.Advertisements;

public class BannerAd : MonoBehaviour
{
    [SerializeField] BannerPosition bannerPosition;

    [SerializeField] string androidAdID = "Banner_Android";
    [SerializeField] string iOSAdID = "Banner_iOS";
    private string adID;

    private void Awake()
    {
        adID = (Application.platform == RuntimePlatform.IPhonePlayer) ? iOSAdID : androidAdID;
    }

    private void Start()
    {
        Advertisement.Banner.SetPosition(bannerPosition);
    }

    public void ShowAd()
    {
        BannerLoadOptions optionsLoad = new BannerLoadOptions {loadCallback = OnBannerLoaded, errorCallback = OnBannerError};
        Advertisement.Banner.Load(adID, optionsLoad);

        BannerOptions optionsShow = new BannerOptions {clickCallback = OnBannerClicked, hideCallback = OnBannerHidden, showCallback = OnBannerShow};
        Advertisement.Banner.Show(adID, optionsShow);
    }

    private void OnBannerLoaded()
    {
        Debug.Log("Баннер загружен");
    }

    private void OnBannerError(string message)
    {
        Debug.Log($"Ошибка загрузки баннера: {message}");
    }

    private void OnBannerClicked()
    {
        Debug.Log("Баннер был кликнут");
    }

    private void OnBannerHidden()
    {
        Debug.Log("Баннер был скрыт");
    }

    private void OnBannerShow()
    {
        Debug.Log("Баннер был показан");
    }
}

Как видите, данный тип рекламы так же очень похож на предыдущие, за исключением новой переменной bannerPosition, которая отвечает за позицию расположения баннеров. Эту позиции можно указать с помощью окна Inspector. Здесь так же, как и в двух других скриптах, присутствует метод ShowAd() для вызова рекламы.

Завершение

После всех манипуляций со скриптами, у нашего объекта Ads, в окне Inspector мы можем наблюдать 4 скрипта: первый скрипт служит подключением к рекламной сети, а остальные 3 скрипта для отображения различных типов реклам.

Важно! Если вы с помощью метода ShowAd() запускаете рекламу в самом начале игры, то у вас может произойти ошибка по причине того, что скрипт показа рекламы может сработать раньше, чем скрипт инициализации. Поэтому необходимо метод ShowAd() вызывать не сразу после запуска сцены, а спустя какое-то время, например 0.5 секунд. А ещё лучше, инициализацию провести в методе Awake().

А на этом всё. Я постарался очень подробно и понятно объяснить подключение монетизации, и надеюсь я вам очень помог. А если остались вопросы, пишите в комментариях, с радостью отвечу.

Вы можете отблагодарить автора донатом. ₽ Спасибо

Комментарии

32
Ford 2 года назад

Спасибо! Всё понятно и доходчиво. Действительно удалось настроить показ рекламы на моём проекте. Но публикацию в Google Play мне отклоняют, по причине того, что в показываемой рекламе есть нарушения. ЦИТАТА:"Как контент приложения, так и показываемые в нем объявления и связанные с ними предложения (например, когда реклама предлагает скачать другое приложение), необходимо подбирать с учетом возрастных ограничений приложения."
Вопрос: как настроить показ рекламы удовлетворяющий требования Google Play?

Admin 2 года назад

Ford, Есть предположение, что при создании ID проекта, в окне Project Settings ты указал значение No, тем самым сказав рекламной площадке юнити, что реклама должна показываться НЕ детская, в то время, как при загрузке игры на гугл плей, ты указал низкие возрастные ограничения. Или же наоборот. То-есть скорее всего тут идёт возрастное несоответствие самой игры и рекламы в ней.

Ford 2 года назад

Admin, Спасибо, буду экспериментировать. Сейчас гугл плей стал жестче относится к показу рекламы. И требует настроить политику безопасности по обработке персональных данных с учетом того, какие персональные данные собирает рекламодатель. А это нам не ведомо. И есть ли возможность отозвать эти данные. Ранее попроще было. А теперь не знаю как пробиться через эти преграды.

Name_325 2 года назад

У меня проблема выскочила.
Не вызываются методы OnInitializationComplete(), OnInitializationFailed(), OnUnityAdsShowClick() и самое неприятное OnUnityAdsShowComplete()
не понимаю в чем проблема.
А еще не пойму должен ли ID из инициализатора попадать в код с включением рекламы

Admin 2 года назад

Name_325, При запуске игры, у тебя в консоле вообще никаких уведомлений об инициализации нет?
1. Скорее всего ID для андройда и айфона введены не верно.
2. Или же ты не добавил библиотеку в начало скрипта инициализации:

using UnityEngine.Advertisements;

3. На третьем скриншоте ты не поставил галочку, что ты работаешь в тестовом режиме.
Если все эти пункты соблюдены, то убедись, что скрипт инициализации добавлен на какой-нибудь игровой объект. Если и это не помогло, тогда больше не знаю причин, по которым могут быть такие проблемы :(

Admin 2 года назад

Name_325, А зачем инициализацию проводить каждый раз при клике на кнопку? Она проводится один раз. Инициализация рекламы - это создание связи с рекламной сетью юнити. Ты эту связь 1 раз создаёшь при старте сцены и всё.

Помести скрипт инициализации на пустой объект, пусть он сразу же автоматически выполнит инициализацию рекламы при загрузки сцены.

Name_325 2 года назад

Admin, я заметил что если вместо Rewarded_Android вставить ID то выходит ошибка Ошибка загрузки рекламы: INVALID_ARGUMENT - Placement 5161147 does not exist for gameId: 5161147 и то же самое с показом

Name_325 2 года назад

Admin, ничего не поменялось

Admin 2 года назад

Name_325, Нет, там ничего менять не нужно. Проблема исключительно в скрипте AdsInitializer. Если бы в нём была ошибка, тогда в консоле отобразилось бы сообщение об ошибке. А поскольку отображений никаких нет, то скорее всего, скрипт по какой-то причине вообще не выполняется. А почему он не выполняется, этого я уже сказать не могу :(

Name_325 2 года назад

Admin, вообще не понимаю. скрипт теперь на другом объекте который активен всегда. код скопировал отсюда. пару сотен раз перепроверил всё.

Name_325 2 года назад

Admin, кароч я переустановил unity ads и оно заработало. спасибо за чудесный гайд :)

Admin 2 года назад

Name_325, пожалуйста

31415 2 года назад

Привет , у меня в консоли когда я нажимаю на кнопку для рекламмы с вознаграждением за рекламму в консоли появляется ошибка : NOT_READY - Placement Rewarded_Android is not ready и еще рекламма воспроизводится а награду не дают

Admin 2 года назад

31415, В консоле помимо этой ошибки выводятся ещё какие-либо уведомления? Просто если у тебя подгружается реклама, то и уведомление об этом должны быть...

Попробуй для проверки, из метода ShowAd() в метод Start() перенести эту строчку

Advertisement.Load(adID, this);

Если всё сработает, то это будет означать, что у тебя вызов рекламы происходит до того, как unity подгрузит рекламу.

31415 2 года назад

Admin, до этого у меня было 2 таких предупреждения после твоего совета 1 : Error showing Ad Unit Rewarded_Android: NOT_READY - Placement Rewarded_Android is not ready

Admin 2 года назад

31415, Теперь этот код вставь в метод OnUnityAdsShowComplete()

Advertisement.Load(adID, this);
То-есть, в итоге у тебя вышенаписанный код будет в двух методах, в Start() и в OnUnityAdsShowComplete().

Если и это не прокатит, то тогда скрипт просто не может найти путь до Rewarded_Android:
1. Убедись, что у тебя в админке на сайте монетизации юнити, у тебя создан баннер типа Rewarded_Android
2. Убедись, что в инспекторе скрипта инициализации(AdsInitializer) встроены правильные ID твоего приложения. Поскольку бывает так, что в скрипте у тебя вписаны одни значения ID, а в инспекторе другие.

31415 2 года назад

Admin, ошибка исчезла но вознаграждение игрок не получает , короче я делаю раннер в котором при поражении высвечивается панель к которой прикрепленна кнопка с возможностью получить 150 монет за рекламму может для моего случая этот код не подходит
В консоли
Реклама загружена: Rewarded_Android
Старт показа реклама: Rewarded_Android


Admin 2 года назад

31415, Ну реклама загружается, уже хорошо :)
Попробуй в методе OnUnityAdsShowComplete() вознаграждение добавлять за пределами оператора if.

31415 2 года назад

Admin, попробовал , не работоает когда высвечивается панель к которой прикрепленна кнопка с возможностью получить 150 монет за рекламму в кнопке я запускаю метод ShowAd() метод OnUnityAdsShowComplete вообще игра не видит
я использую версию юнити 2019 года

Admin 2 года назад

31415, Возможно действительно из-за версии. Точно не могу сказать. Других предположений, почему не работает, у меня нет :(

31415 2 года назад

Admin, Всеравно спасибо , пойду искать решение как найду напишу сюда , чтобы люди с такой же проблемой знали её решение

31415 2 года назад

Для тех у кого та же проблемма , СМЕНИТЕ ВЕРСИЮ !!! Я заменил юнити 2019 года на юнити 2022 и все заработало

plx123 1 год назад

К сожалению не работает. Стоит 2022 года версия Unity(2022.2.16). Всё работает, но когда сделал апк или aab, то не работает рекламный баннер(другие виды реклам я не использовал). Узнал, что скрипт не выполняется, как будто его во время билда удаляют.

Admin 1 год назад

plx123, Возможно из-за того, что не убрал тестовый режим. Убирать его желательно в двух местах, в настройках Project Settings, и в скрипте AdsInitializer, сменить на false.

plx123 1 год назад

Admin, я тестовый режим отключал, но все равно не работает. Я щас сделал проверку и сделал выводы что скрипт AdsInitializer выдаёт ошибку подключения на телефоне. У меня почему-то в Unity >>project settings>>Ads нет кнопки тестовый режим, написан только game ID andoid и ios.

plx123 1 год назад

Скрипт AdsInitializer работает без ошибок, а в скрипте BannerAd выдаёт ошибку загрузки при тесте на андроид.

rehgoc 1 год назад

plx123, Примерно такая же проблема, вот заметил, что сегодня сработала одна из возможных реклам за вознаграждение, баннер не работает, сейчас пытаюсь выяснить причину, т.к. в редакторе все работает очень хорошо

rehgoc 1 год назад

plx123, В общем я решил данную проблему, дело было в том, что в организации (название компании вашей компании) в настройках аккаунта не были настроены реквизиты для вывода и прочее. После заполнения налоговой формы и добавления реквизитов, появились дополнительные настройки и оферта в Unity ads - Unity LevelPlay (IronSource), а уже после заработала реклама и на устройстве в игре.

plx123 1 год назад

Я по другому решил проблему, взял с официального руководства скрипты

kuzinalex7 1 год назад

Здравствуйте. Как подключить рекламу понятно, но нужно же как-то выводить деньги. Это будет работать если игру выложить допустим на собственом сайте, а не в play market-е? Можно будет как-то вывести деньги, если идёт спецоперация?

plx123 1 год назад

Кто знает почему рекламный баннер не отображается на телефоне(выдаёт ошибку при загрузке). В тестовом режиме работает, другие виды реклам работают корректно

Cr1stal 1 год назад

Что делать если на сайте нету кнопки Monetization? В аккаунт зашёл, проект есть и организация тоже.

Гости не могут оставлять комментарии. Войдите на Сайт или Зарегистрируйтесь