Unity激励与插屏广告播放时,如何暂停时间与音乐?Unity是否自动处理?
Unity激励/插屏广告播放时暂停游戏时间与背景音乐的实现
Unity不会自动帮你暂停游戏时间或背景音乐,所有相关逻辑都需要手动编写,核心思路是利用广告的生命周期回调事件,在广告打开时执行暂停操作,关闭时恢复。
一、暂停/恢复游戏时间
游戏时间的控制通过Time.timeScale实现:
- 广告打开时:记录当前时间刻度,然后将
Time.timeScale设为0,这样所有基于时间的游戏逻辑(如物体移动、动画、协程)都会暂停 - 广告关闭时:将
Time.timeScale恢复为之前记录的数值
注意:如果你的UI动画或某些逻辑需要不受timeScale影响,要改用Time.unscaledDeltaTime来计算时间。
二、暂停/恢复背景音乐
根据你使用的音频管理方式,有两种常见实现:
直接控制AudioSource
- 找到背景音乐的
AudioSource组件,广告打开时调用Pause(),关闭时调用UnPause() - 若需要保留音效(如按钮点击声),只针对背景音乐的
AudioSource操作即可
- 找到背景音乐的
通过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
相关产品推荐
相关产品推荐

