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

Unity安卓端Banner广告仅场景重载后延迟显示的问题

Unity安卓Banner广告仅场景重载后显示的解决方法

针对编辑器内Banner广告正常、安卓打包后仅场景重载才显示且存在延迟的问题,以下是具体解决思路和代码调整方案:

核心问题分析

安卓平台下Unity Ads SDK的初始化速度比编辑器慢,你的代码在Start()中直接调用LoadBanner()时,SDK可能还未完成初始化,导致首次加载失败;而场景重载时SDK已经完成初始化,因此广告能正常加载显示。

具体解决方案

1. 等待SDK初始化完成后再加载Banner

添加对广告SDK初始化状态的检查,确保在SDK准备就绪后再执行加载逻辑:

private void Start()
{
    Advertisement.Banner.SetPosition(_bannerPosition);
    // 检查SDK是否已初始化,未初始化则监听初始化完成事件
    if (Advertisement.isInitialized)
    {
        LoadBanner();
    }
    else
    {
        Advertisement.Initialize(/* 你的Game ID */, /* 是否测试模式 */);
        StartCoroutine(WaitForInitialization());
    }
}

private IEnumerator WaitForInitialization()
{
    yield return new WaitUntil(() => Advertisement.isInitialized);
    LoadBanner();
}

2. 优化错误重试机制

在广告加载失败的回调中加入重试逻辑,避免首次加载失败后无后续尝试:

private void OnBannerError(string message)
{
    Debug.Log($"Banner Error: {message}");
    // 延迟1秒后重试加载,可根据需求调整延迟时间
    StartCoroutine(LoadAdBanner());
}

3. 确保广告对象在场景切换时不被销毁(可选)

如果广告挂载对象在场景切换时会被销毁,可添加DontDestroyOnLoad保证其持续存在,避免场景重载时重复初始化:

private void Awake()
{
    _adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
        ? _iOSAdUnitId
        : _androidAdUnitId;
    DontDestroyOnLoad(gameObject);
}

4. 调整Banner显示时机

避免在加载完成后立即显示,可根据游戏逻辑选择合适时机(比如进入主界面后)再调用ShowBannerAd(),减少不必要的延迟感知。

修改后的完整代码示例

using UnityEngine;
using System.Collections;
using UnityEngine.Advertisements;

public class BannerAd : MonoBehaviour
{
    [SerializeField] BannerPosition _bannerPosition;
    [SerializeField] private string _androidAdUnitId = "Banner_Android";
    [SerializeField] private string _iOSAdUnitId = "Banner_iOS";
    [SerializeField] private string _gameId = "你的安卓Game ID";
    [SerializeField] private bool _testMode = true;

    private string _adUnitId;

    private void Awake()
    {
        _adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
            ? _iOSAdUnitId
            : _androidAdUnitId;
        DontDestroyOnLoad(gameObject);
    }

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

    private void InitializeAds()
    {
        if (!Advertisement.isInitialized)
        {
            Advertisement.Initialize(_gameId, _testMode);
            StartCoroutine(WaitForInitialization());
        }
        else
        {
            LoadBanner();
        }
    }

    private IEnumerator WaitForInitialization()
    {
        yield return new WaitUntil(() => Advertisement.isInitialized);
        LoadBanner();
    }

    private IEnumerator LoadAdBanner()
    {
        yield return new WaitForSeconds(1f);
        LoadBanner();
    }

    public void LoadBanner()
    {
        BannerLoadOptions options = new BannerLoadOptions
        {
            loadCallback = OnBannerLoaded,
            errorCallback = OnBannerError
        };

        Advertisement.Banner.Load(_adUnitId, options);
    }

    private void OnBannerLoaded()
    {
        Debug.Log("Banner loaded");
        // 可根据游戏逻辑调整显示时机,比如主界面加载完成后
        ShowBannerAd();
    }

    private void OnBannerError(string message)
    {
        Debug.Log($"Banner Error: {message}");
        StartCoroutine(LoadAdBanner());
    }

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

        Advertisement.Banner.Show(_adUnitId, options);  
    }

    public void HideBannerAd()
    {
        Advertisement.Banner.Hide();
    }

    private void OnBannerClicked() { }
    private void OnBannerShown() { }
    private void OnBannerHidden() { }
}

额外注意事项

  • 确保安卓平台的Game ID和Ad Unit ID在Unity Ads后台配置正确,测试阶段保持测试模式开启
  • 检查安卓打包时的权限配置,Unity Ads需要INTERNET权限,确保已添加
  • 避免在游戏启动瞬间加载广告,可延迟到用户进入主界面后再触发,提升体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:27:13