【UnityADS】在项目添加广告,赚取第一桶金

【UnityADS】在项目添加广告,赚取第一桶金

本文根据Unity官方文档进行撰写,详细可以浏览:[Unity 开发者集成指南](https://docs.unity.com/ads/zh-cn/manual/UnityDeveloperIntegrations)。

广告SDK加入方式

在游戏中加入广告必须导入广告SDK,目前导入广告SDK的方式有两种。一种是通过Unity Package Manager(包管理)导入广告SDK,之后便可以在脚本中直接调用。另一种是在Unity工程中调用工程外的预留方法,并将游戏导出成Andorid/IOS工程,在Android/IOS中加入广告SDK。前者某种程度需要广告商与Untiy间的合作才有相应的包在Untiy中,导致广告SDK种类少、更新慢、广告类型少等诸多缺点。后者需要涉及更多开发知识,操作起来相对比较繁琐,目前是国内公司所采用的方式。

UnityADS插件介绍

UnityADS插件本身就是Unity官方自己推出的广告SDK,但在Unity中添加广告时,只能添加激励(Rewarded)广告、横幅(Banner)广告、插屏(Interstitial)广告。截至当前,使用Android工程接入集成了UnityADS的广告SDK,则可以多一种广告类型——开屏广告。

从Unity官网申请广告ID

  1. 进入Monetization(变现)后台,并登录自己的Unity账号
  2. 点击左侧菜单栏Projects,之后点击Create project进行项目的创建。
    在这里插入图片描述
  3. 创建项目后,点击左侧菜单栏Monetization-Ads,之后选择当前项目,点击Get started打开Project Setup面板,根据情况选择后点击Next按钮。
    在这里插入图片描述
  4. 进入Select Mediation Partner面板根据情况选择后,点击Next按钮。
    在这里插入图片描述
  5. 进入Add Store ID面板根据情况选择后,点击Add Project按钮。
    在这里插入图片描述
  6. 进入Additional resources面板后,就可以查看IOS的Game ID以及Android的Game ID。
    在这里插入图片描述
  7. 我们还可以左侧菜单栏点击Monetization-Ads,再次点击Ad Units按钮,查看IOS的GameID和Android的GameID(重要),以及IOS及Android的各广告类型单元ID(所有项目的都一样,不重要)。
    在这里插入图片描述

在Unity项目添加广告

通过[Monetization(变现)后台](https://dashboard.unity3d.com/monetization)创建项目获取Game ID后,才能拥有广告ID。

1. 导入Advertisement包

在Unity中菜单栏找到Window-Package Manager,打开后搜索或者找到左边菜单栏Advertisement。(注意版本要为3.7.0及以上)。
在这里插入图片描述

2. 初始化SDK代码

using UnityEngine;
using UnityEngine.Advertisements; 
public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener
{//在 SDK 3.7.0 及更高版本中,您可以使用 IUnityAdsInitializationListener 回调在初始化完成时接收通知,或在发生错误时接收详细信息。

    [SerializeField] string _androidGameId = "*******";//Android Game ID (从Monetization(变现)后台申请项目获得)
    [SerializeField] string _iOSGameId = "*******";//IOS Game ID (从Monetization(变现)后台申请项目获得)
    [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
        //Advertisement.isInitialized : 如果 SDK 已初始化,返回 true,否则返回 false。
        //Advertisement.isSupported : 如果 SDK 在当前平台上受支持,返回 true,否则返回 false。
        if (!Advertisement.isInitialized && Advertisement.isSupported)
        {
            //使用指定的 Game ID(游戏 ID)、测试模式状态以及广告单元加载设置来初始化广告服务。
            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}");
    }
}

3. 实现各广告类型代码

- 实现插屏(Interstitial)广告
using UnityEngine;
using UnityEngine.Advertisements;
public class InterstitialAdExample : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{//在 SDK 3.7.0 及更高版本中,可以使用 IUnityAdsLoadListener 和 IUnityAdsShowListener 回调分别实现内容加载或展示成功或失败的逻辑。

    [SerializeField] string _androidAdUnitId = "Interstitial_Android";//Android 全屏插页式广告单元ID(所有项目的同类型广告单元一样)
    [SerializeField] string _iOsAdUnitId = "Interstitial_iOS";//IOS 全屏插页式广告单元ID(所有项目的同类型广告单元一样)
    string _adUnitId;
    
    void Awake()
    {        
        // 获取当前平台的 Ad Unit ID(广告单元 ID):        
        _adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer) ? _iOsAdUnitId : _androidAdUnitId;
    }     
    
    // 将内容加载到广告单元中:
    public void LoadAd()
    {
        // 重要!仅在初始化之后再加载内容(在此示例中,初始化在另一个脚本中处理)。
        Debug.Log("Loading Ad: " + _adUnitId);
        Advertisement.Load(_adUnitId, this);
    }     
    
    // 展示广告单元中加载的内容:
    public void ShowAd()
    {
        // 请注意,如果未事先加载广告内容,此方法将失败
        Debug.Log("Showing Ad: " + _adUnitId);
        Advertisement.Show(_adUnitId, this);
    }     
    
    // 实现 Load Listener 接口方法:
    public void OnUnityAdsAdLoaded(string adUnitId)
    {
        //(可选)如果广告单元成功加载内容,执行代码。
    }     
    
    public void OnUnityAdsFailedToLoad(string _adUnitId, UnityAdsLoadError error, string message)
    {
        //UnityAdsLoadError.INITIALIZE_FAILED == 0 :由于 SDK 未初始化而导致广告加载失败。
        //UnityAdsLoadError.INTERNAL_ERROR == 1 :由于内部 Unity 广告服务错误而导致广告加载失败。
        //UnityAdsLoadError.INVALID_ARGUMENT == 2 :由于 load 方法中的参数无效而导致广告加载失败。
        //UnityAdsLoadError.NO_FILL == 3 :由于广告平台上没有可用的内容而导致广告加载失败。
        //UnityAdsLoadError.TIMEOUT == 4 :广告未能在指定的时间范围内加载。
        Debug.Log($"Error loading Ad Unit: {_adUnitId} - {error.ToString()} - {message}");
        //(可选)如果广告单元加载失败,执行代码(例如再次尝试)。
    }
    
    //实现Show Listener 接口方法:
    public void OnUnityAdsShowFailure(string _adUnitId, UnityAdsShowError error, string message)
    {
        //UnityAdsShowError.NOT_INITIALIZED == 0 :由于 SDK 未初始化而导致广告展示失败。
        //UnityAdsShowError.NOT_READY == 1 :由于广告单元尚未准备就绪而导致广告展示失败。
        //UnityAdsShowError.VIDEO_PLAYER_ERROR == 2 :由于媒体播放器错误而导致广告展示失败。
        //UnityAdsShowError.INVALID_ARGUMENT == 3 :由于 show 方法中的参数无效而导致广告展示失败。
        //UnityAdsShowError.NO_CONNECTION == 4 :由于互联网连接错误而导致广告展示失败。
        //UnityAdsShowError.ALREADY_SHOWING == 5 :由于广告已在展示而导致广告展示失败。
        //UnityAdsShowError.INTERNAL_ERROR == 6 :由于内部 Unity 广告服务错误而导致广告展示失败。
        //UnityAdsShowError.UNKNOWN == 7 :未知
        Debug.Log($"Error showing Ad Unit {_adUnitId}: {error.ToString()} - {message}");
        //(可选)如果广告单元展示失败,执行代码(例如加载另一个广告)。    
    }
    
    /*
    * 广告开始展示时回调
    */
    public void OnUnityAdsShowStart(string _adUnitId) { }
    
    /*
    * 广告被点击时回调
    */
    public void OnUnityAdsShowClick(string _adUnitId) { }
    
    /*
    * 广告展示完成时回调
    */
    public void OnUnityAdsShowComplete(string _adUnitId, UnityAdsShowCompletionState showCompletionState) { }
}
- 实现激励(Rewarded)广告
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
public class RewardedAdsButton : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{//在 SDK 3.7.0 及更高版本中,可以使用 IUnityAdsLoadListener 和 IUnityAdsShowListener 回调分别实现内容加载或展示成功或失败的逻辑。

    [SerializeField] Button _showAdButton;//用来展示激励广告的按钮
    [SerializeField] string _androidAdUnitId = "Rewarded_Android";//Android 激励广告单元ID(所有项目的同类型广告单元一样)
    [SerializeField] string _iOSAdUnitId = "Rewarded_iOS";//IOS 激励广告单元ID(所有项目的同类型广告单元一样)
    string _adUnitId = null; // 对于不受支持的平台,此值将保持为 null
    
    void Awake()
    {
        // 获取当前平台的 Ad Unit ID(广告单元 ID):
#if UNITY_IOS
    _adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
    _adUnitId = _androidAdUnitId;
#endif
        // 在准备好展示广告之前禁用该按钮:
        _showAdButton.interactable = false;
    }
    
    // 将内容加载到广告单元中:
    public void LoadAd()
    {
        // 重要!仅在初始化之后再加载内容(在此示例中,初始化在另一个脚本中处理)。
        Debug.Log("Loading Ad: " + _adUnitId);
        Advertisement.Load(_adUnitId, this);
    }
    
    // 如果广告加载成功,请向按钮添加监听器并启用它:
    public void OnUnityAdsAdLoaded(string adUnitId)
    {
        Debug.Log("Ad Loaded: " + adUnitId);
        if (adUnitId.Equals(_adUnitId))
        {
            // 配置该按钮在单击时调用 ShowAd() 方法:
            _showAdButton.onClick.AddListener(ShowAd);
            // 允许用户点击按钮:
            _showAdButton.interactable = true;
        }
    }     
    
    // 实现当用户点击按钮时执行的方法:
    public void ShowAd()
    {
        // 禁用该按钮:
        _showAdButton.interactable = false;
        // 然后展示广告:
        Advertisement.Show(_adUnitId, this);
    }
    
    // 实现 Show Listener 的 OnUnityAdsShowComplete 回调方法来判断用户是否获得奖励:
    public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
    {
        //UnityAdsShowCompletionState.SKIPPED == 0 :广告跳过
        //UnityAdsShowCompletionState.COMPLETED == 1 :广告观看完成
        //UnityAdsShowCompletionState.UNKNOWN == 2 : 未知情况
        if (adUnitId.Equals(_adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
        {
            Debug.Log("Unity Ads Rewarded Ad Completed");
            // 给予奖励。
        }
    }
    
    // 实现 Load 和 Show Listener 错误回调:
    public void OnUnityAdsFailedToLoad(string adUnitId, UnityAdsLoadError error, string message)
    {
        Debug.Log($"Error loading Ad Unit {adUnitId}: {error.ToString()} - {message}");
        // 使用错误详细信息来确定是否要尝试加载另一个广告。
    }
    
    public void OnUnityAdsShowFailure(string adUnitId, UnityAdsShowError error, string message)
    {
        Debug.Log($"Error showing Ad Unit {adUnitId}: {error.ToString()} - {message}");
        // 使用错误详细信息来确定是否要尝试加载另一个广告。
    }
    
    public void OnUnityAdsShowStart(string adUnitId) { }
    public void OnUnityAdsShowClick(string adUnitId) { }
    void OnDestroy()
    {
        // 清理按钮的监听器:
        _showAdButton.onClick.RemoveAllListeners();
    }
}
- 实现横幅(Banner)广告
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
public class BannerAdExample : MonoBehaviour
{
    // 在本示例中,这些按钮用于功能测试:
    [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;// 对于不受支持的平台,此值将保持为 null。
    
    void Start()
    {
        // 获取当前平台的 Ad Unit ID(广告单元 ID):
#if UNITY_IOS
        _adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
        _adUnitId = _androidAdUnitId;
#endif
        // 在准备好展示广告之前禁用该按钮:
        _showBannerButton.interactable = false;
        _hideBannerButton.interactable = false;
        
        //BannerPosition.TOP_LEFT == 0 :左上角位置
        //BannerPosition.TOP_CENTER == 1 :上面居中位置
        //BannerPosition.TOP_RIGHT == 2 :右上角位置
        //BannerPosition.BOTTOM_LEFT == 3 :左下角位置
        //BannerPosition.BOTTOM_CENTER == 4 :下面居中位置
        //BannerPosition.BOTTOM_RIGHT == 5 :右下角位置
        //BannerPosition.CENTER == 6 :中间位置
        
        // 设置横幅广告位置:
        Advertisement.Banner.SetPosition(_bannerPosition);
        
        // 配置 Load Banner(加载横幅广告)按钮在单击该按钮时调用 LoadBanner() 方法:
        _loadBannerButton.onClick.AddListener(LoadBanner);
        _loadBannerButton.interactable = true;
}

    // 实现一个在单击 Load Banner(加载横幅广告)按钮时调用的方法:
    public void LoadBanner()
    {
        // 设置选项以将加载事件告知 SDK:
        BannerLoadOptions options = new BannerLoadOptions
        {
            loadCallback = OnBannerLoaded,//横幅广告单元成功加载已准备好展示的内容时触发此回调。
            errorCallback = OnBannerError//横幅广告单元加载内容失败时触发此回调。
        };
        // 向广告单元加载横幅广告内容:
        Advertisement.Banner.Load(_adUnitId, options);
    }

    // 实现在 loadCallback 事件触发时执行的代码:
    void OnBannerLoaded()
    {
        Debug.Log("Banner loaded");
        // 配置 Show Banner(展示横幅广告)按钮在单击该按钮时调用 ShowBannerAd() 方法:
        _showBannerButton.onClick.AddListener(ShowBannerAd);
        // 配置 Hide Banner(隐藏横幅广告)按钮在单击该按钮时调用 HideBannerAd() 方法:
        _hideBannerButton.onClick.AddListener(HideBannerAd);
        
        // 启用这两个按钮:
        _showBannerButton.interactable = true;
        _hideBannerButton.interactable = true;
    }

    // 实现在 load errorCallback 事件触发时执行的代码:
    void OnBannerError(string message)
    {
        Debug.Log($"Banner Error: {message}");
        //(可选)执行其他代码,例如尝试加载另一个广告。
    }
    
    // 实现一个在单击 Show Banner(展示横幅广告)按钮时调用的方法:
    void ShowBannerAd()
    {
        // 设置选项以将显示事件告知 SDK:
        BannerOptions options = new BannerOptions
        {
            clickCallback = OnBannerClicked,//用户点击横幅广告时触发此回调。
            hideCallback = OnBannerHidden,//横幅广告对用户不可见时触发此回调。
            showCallback = OnBannerShown//横幅广告对用户可见时触发此回调。
        };
        
        // 展示加载的横幅广告单元:
        Advertisement.Banner.Show(_adUnitId, options);
    }

    // 实现一个在单击 Hide Banner(隐藏横幅广告)按钮时调用的方法:
    void HideBannerAd()
    {
        // 隐藏横幅广告:
        Advertisement.Banner.Hide();
    }
    
    void OnBannerClicked() { }
    void OnBannerShown() { }
    void OnBannerHidden() { }
    void OnDestroy()
    {
        // 清理监听器:
        _loadBannerButton.onClick.RemoveAllListeners();
        _showBannerButton.onClick.RemoveAllListeners();
        _hideBannerButton.onClick.RemoveAllListeners();
    }
}

整合成一个脚本

using UnityEngine;
using UnityEngine.Advertisements;
using System;
using UnityEngine.UI;

public class AdsManager : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
{//在 SDK 3.7.0 及更高版本中,可以使用 IUnityAdsLoadListener 和 IUnityAdsShowListener 回调分别实现内容加载或展示成功或失败的逻辑。

    [SerializeField] string _androidGameId = "*******";//Android Game ID (从Monetization(变现)后台申请项目获得)
    [SerializeField] string _iOSGameId = "*******";//IOS Game ID (从Monetization(变现)后台申请项目获得)
    [SerializeField] bool _testMode = true;//是否为测试模式状态
    private string _gameId;

    [SerializeField] string _androidIntAdUnitId = "Interstitial_Android";//Android 全屏插页式广告单元ID(所有项目的同类型广告单元一样)
    [SerializeField] string _iOsIntAdUnitId = "Interstitial_iOS";//IOS 全屏插页式广告单元ID(所有项目的同类型广告单元一样)
    private string _intAdUnitId;

    [SerializeField] string _androidRewAdUnitId = "Rewarded_Android";//Android 激励广告单元ID(所有项目的同类型广告单元一样)
    [SerializeField] string _iOSRewAdUnitId = "Rewarded_iOS";//IOS 激励广告单元ID(所有项目的同类型广告单元一样)
    private string _rewAdUnitId = null; // 对于不受支持的平台,此值将保持为 null
    private Action<UnityAdsShowCompletionState> curRewCallBack;//当前激励回调方法
    private int curRewCallBackID = 100;

    [SerializeField] BannerPosition _bannerPosition = BannerPosition.BOTTOM_CENTER;
    [SerializeField] string _androidBannAdUnitId = "Banner_Android";
    [SerializeField] string _iOSBannAdUnitId = "Banner_iOS";
    private string _adUnitId = null;// 对于不受支持的平台,此值将保持为 null。
    private bool isBannerShowing = false;//Banner是否正在展示


    void Awake()
    {
        InitializeAds();
    }

    public void InitializeAds()
    {
        // 获取当前平台的 Ad Unit ID(广告单元 ID):
#if UNITY_IOS
        _gameId = _iOSGameId;
        _intAdUnitId = _iOsIntAdUnitId;
        _rewAdUnitId = _iOSRewAdUnitId;
        _adUnitId = _iOSBannAdUnitId;
#elif UNITY_ANDROID
        _gameId = _androidGameId;
        _intAdUnitId = _androidIntAdUnitId;
        _rewAdUnitId = _androidRewAdUnitId;
        _adUnitId = _androidBannAdUnitId;
#elif UNITY_EDITOR
        _gameId = _androidGameId;//Only for testing the functionality in the Editor
        _intAdUnitId = _androidIntAdUnitId;
        _rewAdUnitId = _androidRewAdUnitId;
        _adUnitId = _androidBannAdUnitId;
#endif

        //Advertisement.isInitialized : 如果 SDK 已初始化,返回 true,否则返回 false。
        //Advertisement.isSupported : 如果 SDK 在当前平台上受支持,返回 true,否则返回 false。
        if (!Advertisement.isInitialized && Advertisement.isSupported)
        {
            //使用指定的 Game ID(游戏 ID)、测试模式状态以及广告单元加载设置来初始化广告服务。
            Advertisement.Initialize(_gameId, _testMode, this);
        }


        
    }
#region 初始化回调
    //--------------------(↓)初始化回调--------------------
    /*
    * 初始化完成回调方法
    */
    public void OnInitializationComplete()
    {
        Debug.Log("Unity Ads initialization complete.");
        LoadIntAd();
        LoadRewAd();
        LoadBanner();
    }

    /*
    * 初始化失败回调方法
    */
    public void OnInitializationFailed(UnityAdsInitializationError error, string message)
    {
        Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
    }

    //--------------------(↑)初始化回调--------------------
#endregion

#region 各类型广告的加载和请求 及 横幅自定义回调方法

    // 将内容加载到广告单元中:
    private void LoadIntAd()
    {
        // 重要!仅在初始化之后再加载内容(在此示例中,初始化在另一个脚本中处理)。
        Debug.Log("Loading Ad: " + _intAdUnitId);
        Advertisement.Load(_intAdUnitId, this);
    }

    // 展示广告单元中加载的内容:
    public void ShowIntAd()
    {
        // 请注意,如果未事先加载广告内容,此方法将失败
        Debug.Log("Showing Ad: " + _intAdUnitId);
        Advertisement.Show(_intAdUnitId, this);
    }

    // 将内容加载到广告单元中:
    private void LoadRewAd()
    {
        // 重要!仅在初始化之后再加载内容(在此示例中,初始化在另一个脚本中处理)。
        Debug.Log("Loading Ad: " + _rewAdUnitId);
        Advertisement.Load(_rewAdUnitId, this);
    }

    // 实现当用户点击按钮时执行的方法:
    public void ShowRewAd(Action<UnityAdsShowCompletionState> rewCallBack)
    {
        if (curRewCallBackID == 1) 
        {
            return;
        }
        curRewCallBack = rewCallBack;
        // 然后展示广告:
        Advertisement.Show(_rewAdUnitId, this);
        curRewCallBackID = 1;
    }

    // 实现一个在单击 Load Banner(加载横幅广告)按钮时调用的方法:
    private void LoadBanner()
    {
        Debug.Log("Loading Ad: Banner");

        //BannerPosition.TOP_LEFT == 0 :左上角位置
        //BannerPosition.TOP_CENTER == 1 :上面居中位置
        //BannerPosition.TOP_RIGHT == 2 :右上角位置
        //BannerPosition.BOTTOM_LEFT == 3 :左下角位置
        //BannerPosition.BOTTOM_CENTER == 4 :下面居中位置
        //BannerPosition.BOTTOM_RIGHT == 5 :右下角位置
        //BannerPosition.CENTER == 6 :中间位置
        // 设置横幅广告位置:
        Advertisement.Banner.SetPosition(_bannerPosition);

        // 设置选项以将加载事件告知 SDK:
        BannerLoadOptions options = new BannerLoadOptions
        {
            loadCallback = OnBannerLoaded,//横幅广告单元成功加载已准备好展示的内容时触发此回调。
            errorCallback = OnBannerError//横幅广告单元加载内容失败时触发此回调。
        };
        // 向广告单元加载横幅广告内容:
        Advertisement.Banner.Load(_adUnitId, options);
    }

    // 实现在 loadCallback 事件触发时执行的代码:
    private void OnBannerLoaded()
    {
        Debug.Log("Banner的广告加载成功");
    }

    // 实现在 load errorCallback 事件触发时执行的代码:
    private void OnBannerError(string message)
    {
        Debug.Log($"Banner Error: {message}");
        //(可选)执行其他代码,例如尝试加载另一个广告。
    }

    // 实现一个在单击 Show Banner(展示横幅广告)按钮时调用的方法:
    public void ShowBannerAd(BannerPosition bannerPos = BannerPosition.BOTTOM_CENTER)
    {
        if (isBannerShowing)
        {
            return;
        }

        // 设置选项以将显示事件告知 SDK:
        BannerOptions options = new BannerOptions
        {
            clickCallback = OnBannerClicked,//用户点击横幅广告时触发此回调。
            hideCallback = OnBannerHidden,//横幅广告对用户不可见时触发此回调。
            showCallback = OnBannerShown//横幅广告对用户可见时触发此回调。
        };

        // 展示加载的横幅广告单元:
        Advertisement.Banner.Show(_adUnitId, options);
    }

    // 实现一个在单击 Hide Banner(隐藏横幅广告)按钮时调用的方法:
    public void HideBannerAd()
    {
        if(!isBannerShowing)
        {
            return;
        }
        // 隐藏横幅广告:
        Advertisement.Banner.Hide();
    }

    private void OnBannerClicked() { }
    private void OnBannerShown()
    {
        isBannerShowing = true;
    }
    private void OnBannerHidden()
    {
        isBannerShowing = false;
    }

#endregion

#region 展示情况回调
    //--------------------(↓)展示情况回调--------------------

    public void OnUnityAdsAdLoaded(string placementId)
    {
        Debug.Log(placementId + "的广告加载成功");
    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {
        //UnityAdsLoadError.INITIALIZE_FAILED == 0 :由于 SDK 未初始化而导致广告加载失败。
        //UnityAdsLoadError.INTERNAL_ERROR == 1 :由于内部 Unity 广告服务错误而导致广告加载失败。
        //UnityAdsLoadError.INVALID_ARGUMENT == 2 :由于 load 方法中的参数无效而导致广告加载失败。
        //UnityAdsLoadError.NO_FILL == 3 :由于广告平台上没有可用的内容而导致广告加载失败。
        //UnityAdsLoadError.TIMEOUT == 4 :广告未能在指定的时间范围内加载。
        //UnityAdsLoadError.UNKNOWN == 5 :未知

        Debug.Log($"Error loading Ad Unit: {placementId} - {error.ToString()} - {message}");
        Debug.Log(placementId + "的广告加载失败");
        switch (error)
        {
            case UnityAdsLoadError.INTERNAL_ERROR:
            case UnityAdsLoadError.NO_FILL:
            case UnityAdsLoadError.TIMEOUT:
                if (placementId == _intAdUnitId)
                {
                    LoadIntAd();
                }
                else if (placementId == _rewAdUnitId)
                {
                    LoadRewAd();
                }
                break;
        }
        
    }

    public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
    {
        //UnityAdsShowError.NOT_INITIALIZED == 0 :由于 SDK 未初始化而导致广告展示失败。
        //UnityAdsShowError.NOT_READY == 1 :由于广告单元尚未准备就绪而导致广告展示失败。
        //UnityAdsShowError.VIDEO_PLAYER_ERROR == 2 :由于媒体播放器错误而导致广告展示失败。
        //UnityAdsShowError.INVALID_ARGUMENT == 3 :由于 show 方法中的参数无效而导致广告展示失败。
        //UnityAdsShowError.NO_CONNECTION == 4 :由于互联网连接错误而导致广告展示失败。
        //UnityAdsShowError.ALREADY_SHOWING == 5 :由于广告已在展示而导致广告展示失败。
        //UnityAdsShowError.INTERNAL_ERROR == 6 :由于内部 Unity 广告服务错误而导致广告展示失败。
        //UnityAdsShowError.UNKNOWN == 7 :未知

        Debug.Log(placementId + "的广告展示失败");
        switch (error)
        {
            case UnityAdsShowError.NOT_READY:
            case UnityAdsShowError.VIDEO_PLAYER_ERROR:
            case UnityAdsShowError.NO_CONNECTION:
            case UnityAdsShowError.INTERNAL_ERROR:
                if (placementId.Equals(_rewAdUnitId))
                {
                    Debug.Log("Unity Ads Rewarded Ad Completed");
                    // 反馈激励广告结果
                    curRewCallBack(UnityAdsShowCompletionState.UNKNOWN);
                    curRewCallBackID = 100;
                }

                if (placementId == _intAdUnitId)
                {
                    LoadIntAd();
                }
                else if (placementId == _rewAdUnitId)
                {
                    LoadRewAd();
                }
                break;
        }
        
    }

    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(placementId + "的广告完成状态 : " + showCompletionState);
        if (placementId.Equals(_rewAdUnitId))
        {
            Debug.Log("Unity Ads Rewarded Ad Completed");
            // 反馈激励广告结果
            curRewCallBack(showCompletionState);
            curRewCallBackID = 100;

            LoadRewAd();
        }
        else if(placementId.Equals(_intAdUnitId))
        {
            LoadIntAd();
        }
    }

    //--------------------(↑)展示情况回调--------------------

#endregion

#region 各广告展示方法

    /// <summary>
    /// 展示插屏广告
    /// </summary>
    public void ShowIntAds()
    {
        ShowIntAd();
    }

    /// <summary>
    /// 展示激励广告
    /// </summary>
    public void ShowRewAds()
    {
        ShowRewAd(result =>
        {
            switch (result)
            {
                case UnityAdsShowCompletionState.COMPLETED:
                    Debug.Log("广告展示完成,获得奖励 + 500金币");
                    break;
                case UnityAdsShowCompletionState.SKIPPED:
                    Debug.Log("广告中途停止退出,给不给奖励自己看着办");
                    break;
                case UnityAdsShowCompletionState.UNKNOWN:
                    Debug.Log("未知错误,不给奖励");
                    break;
            }
        });
    }

    /// <summary>
    /// 展示横幅广告
    /// </summary>
    public void ShowBannerAds()
    {
        ShowBannerAd();
    }

    /// <summary>
    /// 隐藏横幅广告
    /// </summary>
    public void HideBannerAds()
    {
        HideBannerAd();
    }
#endregion
}

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值