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

Unity激励与插屏广告播放时,如何暂停时间与音乐?Unity是否自动处理?

Unity激励/插屏广告播放时暂停游戏时间与背景音乐的实现

Unity不会自动帮你暂停游戏时间或背景音乐,所有相关逻辑都需要手动编写,核心思路是利用广告的生命周期回调事件,在广告打开时执行暂停操作,关闭时恢复。

一、暂停/恢复游戏时间

游戏时间的控制通过Time.timeScale实现:

  • 广告打开时:记录当前时间刻度,然后将Time.timeScale设为0,这样所有基于时间的游戏逻辑(如物体移动、动画、协程)都会暂停
  • 广告关闭时:将Time.timeScale恢复为之前记录的数值

注意:如果你的UI动画或某些逻辑需要不受timeScale影响,要改用Time.unscaledDeltaTime来计算时间。

二、暂停/恢复背景音乐

根据你使用的音频管理方式,有两种常见实现:

  1. 直接控制AudioSource

    • 找到背景音乐的AudioSource组件,广告打开时调用Pause(),关闭时调用UnPause()
    • 若需要保留音效(如按钮点击声),只针对背景音乐的AudioSource操作即可
  2. 通过AudioMixer控制音量

    • 给背景音乐轨道分配单独的AudioMixer组,广告打开时将该组音量调至静音(如设为-80dB),关闭时恢复原音量
    • 这种方式更灵活,适合有多个音频轨道的场景

三、结合广告回调的完整示例(以Unity Ads为例)

using UnityEngine;
using UnityEngine.Advertisements;

public class AdPauseHandler : MonoBehaviour, IUnityAdsListener
{
    [SerializeField] private AudioSource bgMusicSource;
    [SerializeField] private string rewardedAdId = "Rewarded_Android";
    [SerializeField] private string interstitialAdId = "Interstitial_Android";

    private float _originalTimeScale;
    private float _originalMusicVolume;

    void Start()
    {
        Advertisement.AddListener(this);
        _originalMusicVolume = bgMusicSource.volume;
    }

    // 播放激励广告
    public void TriggerRewardedAd()
    {
        if (Advertisement.IsReady(rewardedAdId))
            Advertisement.Show(rewardedAdId);
    }

    // 播放插屏广告
    public void TriggerInterstitialAd()
    {
        if (Advertisement.IsReady(interstitialAdId))
            Advertisement.Show(interstitialAdId);
    }

    // 广告开始播放时触发
    public void OnUnityAdsDidStart(string placementId)
    {
        // 暂停游戏时间
        _originalTimeScale = Time.timeScale;
        Time.timeScale = 0f;

        // 暂停背景音乐
        bgMusicSource.Pause();
        // 若用AudioMixer:
        // audioMixer.GetFloat("MusicVolume", out _originalMusicVolume);
        // audioMixer.SetFloat("MusicVolume", -80f);
    }

    // 广告结束播放时触发
    public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
    {
        // 恢复游戏时间
        Time.timeScale = _originalTimeScale;

        // 恢复背景音乐
        bgMusicSource.UnPause();
        // 若用AudioMixer:
        // audioMixer.SetFloat("MusicVolume", _originalMusicVolume);
    }

    // 以下为接口必填实现(可留空)
    public void OnUnityAdsDidError(string message) {}
    public void OnUnityAdsDidClick(string placementId) {}
}

关键注意事项

  • 确保在广告回调中执行暂停/恢复逻辑,不要在调用Advertisement.Show()后直接执行,因为广告不会立即打开
  • 若使用第三方广告SDK(如AdMob),逻辑类似,只需替换对应的广告打开/关闭回调事件即可
  • 测试时要验证广告异常关闭(如用户手动关闭)的场景,确保游戏状态能正常恢复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:50:34