Unity Banner广告非测试模式无法显示问题求助(多次调用Initialize仍提示未初始化)
看了你的代码和报错信息,问题主要出在重复初始化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
相关产品推荐
相关产品推荐

