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

Unity中AudioSource恢复播放功能异常问题求助

问题:Unity切换界面后音频暂停无法从断点恢复,从头播放

在Unity项目的介绍界面中,用户通过前进按钮切换不同的图片+音频组,每个界面配有播放、暂停、重播按钮。第一个界面功能正常,但切换到加载新资源的第二个界面后,暂停音频再点击播放,音频会从头开始而非从暂停点恢复。

调试时发现,执行_audioSource.UnPause()时音频能正常从断点恢复,但退出调试回到Unity运行时问题复现。已尝试将AudioSource的Play On Awake设为false,无效。

相关代码如下:

public void PlayAudio()
{
    if (_bIsAudioPaused)
    {
        _audioSource.UnPause();
    }
    else
    {
        _audioSource.Play();
    }

    _playButton.SetActive(false);
    _bIsAudioPaused = false;
    _bIsAudioPlaying = true;
    Screen.sleepTimeout = SleepTimeout.NeverSleep;
}

public void PauseAudio()
{
    _audioSource.Pause();
    _bIsAudioPaused = true;
    _bIsAudioPlaying = false;
    Screen.sleepTimeout = SleepTimeout.SystemSetting;
}

public void ReplayAudio()
{
    PlayAudio();
}

public void AudioFinished()
{
    _bIsAudioPlaying = false;
    Screen.sleepTimeout = SleepTimeout.SystemSetting;
}
private void Update()
{
    if (_bIsAudioPlaying && !_audioSource.isPlaying)
    {
        AudioFinished();
    }
}

可能的原因及修复方案:

  • 界面切换时状态不同步
    切换界面加载新资源时,状态变量_bIsAudioPaused可能未与AudioSource的实际状态同步。在界面激活时(比如OnEnable())添加状态同步逻辑:

    void OnEnable()
    {
        _bIsAudioPaused = !_audioSource.isPlaying;
        _bIsAudioPlaying = _audioSource.isPlaying;
    }
    
  • 手动记录并恢复暂停进度
    直接依赖UnPause()可能因资源加载导致状态异常,改为手动记录暂停时的进度,恢复时强制设置:

    private float _lastPausedTime;
    
    public void PauseAudio()
    {
        _lastPausedTime = _audioSource.time;
        _audioSource.Pause();
        _bIsAudioPaused = true;
        _bIsAudioPlaying = false;
        Screen.sleepTimeout = SleepTimeout.SystemSetting;
    }
    
    public void PlayAudio()
    {
        if (_bIsAudioPaused)
        {
            _audioSource.time = _lastPausedTime;
            _audioSource.Play();
        }
        else
        {
            _audioSource.time = 0;
            _audioSource.Play();
        }
    
        _playButton.SetActive(false);
        _bIsAudioPaused = false;
        _bIsAudioPlaying = true;
        Screen.sleepTimeout = SleepTimeout.NeverSleep;
    }
    
  • 检查界面切换时的AudioClip赋值逻辑
    确认切换界面加载新音频时,仅在需要播放全新音频时重置_audioSource.time为0,避免覆盖暂停状态下的进度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:17:17