Реклама в мобильных играх Unity

Несколько обновленная версия скрипта, для встраивания рекламы AdMob, в свои мобильные приложения. Основная идея в том, чтобы работать с одним экземпляром скрипта, то есть, если у вас несколько сцен, скрипт нужно добавить только на стартовую сцену, далее, он будет переходить в другие сцены автоматом. Скрипт поддерживает необходимые запросы, чтобы обновлять рекламу, и так же удобные настройки в инспекторе, в частности для баннера. Поддерживаются три вида рекламы: баннер, межстраничное, видео с вознаграждением. Чтобы активировать ту или иную рекламу, достаточно добавить идентификатор этого объявления в соответствующее поле, в инспекторе.

Реклама в мобильных играх Unity

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



Сам скрипт, вешать его нужно на пустой объект и только в стартовой сцене:
using GoogleMobileAds.Api;
using UnityEngine;

public class GameAds : MonoBehaviour {

    public enum BannerSize { Standard, Medium, Full, Leaderboard, Smart }
    [Header("Идентификатор приложения")]
    [Tooltip("Обязательно для работы скрипта.")]
    public string applicationID;
    [Header("Banner Settings")]
    [Tooltip("Оставить пустым, если не нужно.")]
    public string bannerKey;
    [Tooltip("Standard = 320x50\nMedium = 300x250\nFull = 468x60\nLeaderboard = 728x90\nSmart = 100%x32|50|90")]
    public BannerSize bannerSize;
    public AdPosition bannerPosition;
    [Header("Interstitial Settings")]
    [Tooltip("Оставить пустым, если не нужно.")]
    public string interstitialKey;
    [Header("Rewarded video Settings")]
    [Tooltip("Оставить пустым, если не нужно.")]
    public string rewardKey;
    [Header("Режим тестирования")]
    public bool testMode = false;
    private static GameAds _inst;
    private BannerView bannerView;
    private InterstitialAd interstitial;
    private RewardBasedVideoAd rewardBasedVideo;
    private enum Mode { Banner, Interstitial, RewardedVideo }

    AdSize GetAdSize()
    {
        if (bannerSize == BannerSize.Full)
        {
            return AdSize.IABBanner;
        }
        else if (bannerSize == BannerSize.Leaderboard)
        {
            return AdSize.Leaderboard;
        }
        else if (bannerSize == BannerSize.Medium)
        {
            return AdSize.MediumRectangle;
        }
        else if (bannerSize == BannerSize.Smart)
        {
            return AdSize.SmartBanner;
        }

        return AdSize.Banner;
    }

    void Awake()
    {
        if (string.IsNullOrEmpty(applicationID.Trim())) return;
        _inst = this;
        DontDestroyonload(gameObject); // не уничтожать этот экземпляр
        Initialize();
    }

    void Initialize()
    {
        MobileAds.Initialize(applicationID);

        if (!string.IsNullOrEmpty(rewardKey.Trim()))
        {
            rewardBasedVideo = RewardBasedVideoAd.Instance;
            rewardBasedVideo.OnAdLoaded += OnAdLoadedReward;
            rewardBasedVideo.OnAdFailedToLoad += OnAdFailedToLoadReward;
            rewardBasedVideo.OnAdOpening += OnAdOpenedReward;
            rewardBasedVideo.OnAdStarted += OnAdStartedReward;
            rewardBasedVideo.OnAdRewarded += OnAdRewarded;
            rewardBasedVideo.OnAdClosed += OnAdClosedReward;
            rewardBasedVideo.OnAdLeavingApplication += OnAdLeavingApplicationReward;
        }

        RequestAll(); // запрос на всё
    }

    public static void ShowReward() // показать, видео с вознаграждением
    {
        if (_inst == null) return;
        _inst.ShowReward_inst();
    }

    void ShowReward_inst()
    {
        if (rewardBasedVideo != null && rewardBasedVideo.IsLoaded())
        {
            rewardBasedVideo.Show();
        }
    }

    public static void ShowInterstitial() // показать межстраничное
    {
        if (_inst == null) return;
        _inst.ShowInterstitial_inst();
	}

    void ShowInterstitial_inst()
	{
        if (interstitial != null && interstitial.IsLoaded())
		{
			interstitial.Show();
		}
	}

	public static void HideBanner() // спрятать баннер
    {
        if (_inst == null) return;
        _inst.HideBanner_inst();
	}

	public static void ShowBanner() // показать баннер
    {
        if (_inst == null) return;
        _inst.ShowBanner_inst();
	}

	void HideBanner_inst()
	{
        if (bannerView == null) return;
        bannerView.Hide();
	}

	void ShowBanner_inst()
	{
        if (bannerView == null) return;
        bannerView.Show();
	}

	void RequestAll()
	{
        RequestBanner();
        RequestInterstitial();
        RequestReward();
    }

    public static void RequestBanner() // запрос нового баннера
    {
        if (_inst == null) return;
        _inst.RequestBanner_inst();
    }

    void RequestBanner_inst()
    {
        if (bannerView != null)
        {
            bannerView.Destroy();
        }


        if (string.IsNullOrEmpty(bannerKey.Trim())) return;
        bannerView = new BannerView(GetUnitID(Mode.Banner, bannerKey), GetAdSize(), bannerPosition);
        bannerView.OnAdLoaded += OnAdLoadedBanner;
        bannerView.OnAdFailedToLoad += OnAdFailedToLoadBanner;
        bannerView.OnAdOpening += OnAdOpenedBanner;
        bannerView.OnAdClosed += OnAdClosedBanner;
        bannerView.OnAdLeavingApplication += OnAdLeavingApplicationBanner;
        bannerView.LoadAd(new AdRequest.Builder().Build());
        bannerView.Hide();
    }

    public static void RequestInterstitial() // запрос нового межстраничного
    {
        if (_inst == null) return;
        _inst.RequestInterstitial_inst();
    }

    void RequestInterstitial_inst()
    {
        if (interstitial != null)
        {
            interstitial.Destroy();
        }

        if (string.IsNullOrEmpty(interstitialKey.Trim())) return;
        interstitial = new InterstitialAd(GetUnitID(Mode.Interstitial, interstitialKey));
        interstitial.OnAdLoaded += OnAdLoadedInterstitial;
        interstitial.OnAdFailedToLoad += OnAdFailedToLoadInterstitial;
        interstitial.OnAdOpening += OnAdOpenedInterstitial;
        interstitial.OnAdClosed += OnAdClosedInterstitial;
        interstitial.OnAdLeavingApplication += OnAdLeavingApplicationInterstitial;
        interstitial.LoadAd(new AdRequest.Builder().Build());
    }

    void RequestReward()
    {
        if (string.IsNullOrEmpty(rewardKey.Trim()) || rewardBasedVideo != null) return;
        rewardBasedVideo.LoadAd(new AdRequest.Builder().Build(), GetUnitID(Mode.RewardedVideo, rewardKey));
    }

    string GetUnitID(Mode mode, string key)
    {
#if UNITY_EDITOR
        return "unused";
#elif UNITY_ANDROID || UNITY_IPHONE
        string keyTest = "unused";

        switch (mode)
        {
            case Mode.Banner:
                keyTest = "ca-app-pub-3940256099942544/6300978111";
                break;

            case Mode.Interstitial:
                keyTest = "ca-app-pub-3940256099942544/1033173712";
                break;

            case Mode.RewardedVideo:
                keyTest = "ca-app-pub-3940256099942544/5224354917";
                break;
        }

		return testMode ? keyTest : key;
#else
		return "unexpected_platform";
#endif
    }

    #region REWARDED ADS
    void OnAdLoadedReward(object sender, System.EventArgs args)
    {
        // Called when an ad request has successfully loaded.
    }

    void OnAdFailedToLoadReward(object sender, AdFailedToLoadEventArgs args)
    {
        // Called when an ad request failed to load.
    }

    void OnAdOpenedReward(object sender, System.EventArgs args)
    {
        // Called when an ad is shown.
    }

    void OnAdStartedReward(object sender, System.EventArgs args)
    {
        // Called when the ad starts to play.
    }

    void OnAdClosedReward(object sender, System.EventArgs args)
    {
        // Called when the ad is closed.
        RequestReward(); // обновить
    }

    void OnAdRewarded(object sender, Reward args)
    {
        // Called when the user should be rewarded for watching a video.
        string type = args.Type;
        double amount = args.Amount;
        Debug.Log("Rewarded event received for " + amount.ToString() + " " + type);
    }

    void OnAdLeavingApplicationReward(object sender, System.EventArgs args)
    {
        // Called when the ad click caused the user to leave the application.
    }
    #endregion

    #region INTERSTITIAL
    void OnAdLoadedInterstitial(object sender, System.EventArgs args)
    {
        // Called when an ad request has successfully loaded.
    }

    void OnAdFailedToLoadInterstitial(object sender, AdFailedToLoadEventArgs args)
    {
        // Called when an ad request failed to load.
    }

    void OnAdOpenedInterstitial(object sender, System.EventArgs args)
    {
        // Called when an ad is shown.
    }

    void OnAdClosedInterstitial(object sender, System.EventArgs args)
    {
        // Called when the ad is closed.
    }

    void OnAdLeavingApplicationInterstitial(object sender, System.EventArgs args)
    {
        // Called when the ad click caused the user to leave the application.
    }
    #endregion

    #region BANNER
    void OnAdLoadedBanner(object sender, System.EventArgs args)
    {
        // Called when an ad request has successfully loaded.
    }

    void OnAdFailedToLoadBanner(object sender, AdFailedToLoadEventArgs args)
    {
        // Called when an ad request failed to load.
    }

    void OnAdOpenedBanner(object sender, System.EventArgs args)
    {
        // Called when an ad is shown.
    }

    void OnAdClosedBanner(object sender, System.EventArgs args)
    {
        // Called when the ad is closed.
    }

    void OnAdLeavingApplicationBanner(object sender, System.EventArgs args)
    {
        // Called when the ad click caused the user to leave the application.
    }
    #endregion
}

Более подробную инструкцию смотрите тут: https://developers.google.com/admob/unity/start

Скачать плагин: https://github.com/googleads/googleads-mobile-plugins/releases/latest

Скачать скрипт:
Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 5

Офлайн
alenasexbXX 25 июня 2019
спс бро получил 1000000000000000000000000000000000000$
Офлайн
Light 25 июня 2019
alenasexbXX, на здоровье, на забудь поделиться))
Офлайн
alenasexbXX 26 июня 2019
Light,
бро дал 20 рублей проста я bomj

Light,
кстатиииц, сдэлаешь урок по ЮНИТИ ЭДС?
Просто очень понятно объясняешь))))))))))))))))))))))))))))))))))
может быть еще задоначу, просто я bomj\\
пишу не грамотно из-за аутимзма
бля сайт алагет аааааааааааааааа
Офлайн
Liphanes 26 июня 2019
Есть такой вопрос, он не по теме, но все же как в Unity обстоят дела с модификациями? Есть ли вариант использовать внешние ресурсы, ибо как я помню Assets запаковывается и засунуть в него из вне что либо не представляется возможным. И если сэйвы Unity вроде как может подтянуть, то вот анимации префабы и прочее, я так понял нет. Просто хотелось бы добавить возможность пользователям модификации делать
Офлайн
Light 26 июня 2019
Liphanes, ресурсы надо паковать в assetbundle, чтобы потом загружать их из вне, в самой игре. Единственное только, что нельзя так паковать скрипты. А текстуры, анимации, материалы и т.п... можно.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика