You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Banner广告非测试模式无法显示问题求助(多次调用Initialize仍提示未初始化)

解决Unity Banner广告正式模式无法加载(提示未初始化)的问题

看了你的代码和报错信息,问题主要出在重复初始化SDK以及没有正确处理初始化的异步性上,另外还有一些细节需要调整,以下是具体的修复方案:

核心问题分析

  • 重复调用Advertisement.Initialize:你在Start()、LoadBanner()、ShowBannerAd()里都重复调用了初始化方法,这会严重干扰SDK的内部状态,正式模式下SDK的状态校验更严格,所以直接触发了"UnityAds is not initialized"错误。Initialize只需要在游戏启动时调用一次即可。
  • 未处理初始化的异步回调:Unity Ads的初始化是异步操作,你现在直接在Start里就尝试加载广告,可能SDK还没完成初始化,尤其是正式模式下网络请求延迟更高,更容易出现状态异常。
  • 平台AdUnitId未适配:代码里_adUnitId固定为Android的ID,iOS平台会使用错误的广告单元ID,正式模式下会直接导致加载失败。
  • 按钮状态初始设置错误:Start里直接把_showBannerButton设为可交互,但此时广告还没加载完成,逻辑上不合理,也容易引发误操作。

修正后的代码

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

public class newadsystem : 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";
    private string _adUnitId;

    void Start()
    {
        // 根据当前平台自动匹配对应的广告单元ID
        _adUnitId = Application.platform == RuntimePlatform.Android ? _androidAdUnitId : _iOsAdUnitId;

        // 初始化按钮状态:默认只有加载按钮可用,显示/隐藏按钮先禁用
        _loadBannerButton.interactable = true;
        _showBannerButton.interactable = false;
        _hideBannerButton.interactable = false;

        // 设置Banner默认显示位置
        Advertisement.Banner.SetPosition(_bannerPosition);

        // 绑定加载按钮的点击事件
        _loadBannerButton.onClick.AddListener(LoadBanner);

        // 仅调用一次初始化,使用正式模式参数(testMode设为false),并监听初始化结果
        Advertisement.Initialize("4395157", false, (initSuccess) => 
        {
            if(initSuccess)
            {
                Debug.Log("Unity Ads初始化成功");
                // 初始化成功后可以自动加载广告,也可以保留手动加载逻辑
                // LoadBanner();
            }
            else
            {
                Debug.LogError("Unity Ads初始化失败,请检查后台配置与网络连接");
                _loadBannerButton.interactable = false;
            }
        });
    }

    public void LoadBanner()
    {
        // 加载前先校验SDK是否已初始化
        if(!Advertisement.isInitialized)
        {
            Debug.LogError("Unity Ads尚未初始化,无法加载Banner广告");
            return;
        }

        BannerLoadOptions options = new BannerLoadOptions
        {
            loadCallback = OnBannerLoaded,
            errorCallback = OnBannerError
        };

        Advertisement.Banner.Load(_adUnitId, options);
        // 加载过程中禁用加载按钮,避免重复发起请求
        _loadBannerButton.interactable = false;
    }

    void OnBannerLoaded()
    {
        Debug.Log("Banner广告加载完成");
        _showBannerButton.onClick.AddListener(ShowBannerAd);
        _hideBannerButton.onClick.AddListener(HideBannerAd);
        _showBannerButton.interactable = true;
        _hideBannerButton.interactable = false; // 初始状态下隐藏按钮不可用,显示后再开放
    }

    void OnBannerError(string message)
    {
        Debug.Log($"Banner加载错误: {message}");
        // 加载失败后重新启用加载按钮,允许用户重试
        _loadBannerButton.interactable = true;
    }

    void ShowBannerAd()
    {
        BannerOptions options = new BannerOptions
        {
            clickCallback = OnBannerClicked,
            hideCallback = OnBannerHidden,
            showCallback = OnBannerShown
        };

        Advertisement.Banner.Show(_adUnitId, options);
        _showBannerButton.interactable = false;
        _hideBannerButton.interactable = true;
    }

    void HideBannerAd()
    {
        Advertisement.Banner.Hide();
        _showBannerButton.interactable = true;
        _hideBannerButton.interactable = false;
    }

    void OnBannerClicked() { Debug.Log("Banner被点击!"); }
    void OnBannerShown() { Debug.Log("Banner已显示!"); }
    void OnBannerHidden() { Debug.Log("Banner已隐藏"); }

    void OnDestroy()
    {
        // 清理按钮事件监听,避免内存泄漏
        _loadBannerButton.onClick.RemoveAllListeners();
        _showBannerButton.onClick.RemoveAllListeners();
        _hideBannerButton.onClick.RemoveAllListeners();
    }
}

额外注意事项

  • 正式模式配置校验:确保Unity Ads后台已为你的应用创建了正确的正式广告单元,且应用的包名、签名信息与后台配置完全一致。
  • 网络权限检查:Android平台需要确保应用已申请INTERNET权限,正式模式下广告加载依赖稳定的网络连接。
  • 测试模式切换:正式发布前务必确认Initialize的testMode参数设为false,测试模式广告不会产生收益,且正式环境下无法展示测试广告。

内容的提问来源于stack exchange,提问作者DAOCMINECRAFT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:27:38