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

Unity C#脚本按键直接加载场景 未播放音频等待跳转问题求助

问题根因

现有代码是同步执行逻辑:调用soundPlayer.Play()仅为启动音频播放,不会阻塞等待音频播放完成,会立刻执行下一行的SceneManager.LoadScene(2)触发场景切换。场景切换后当前场景的所有对象(包括挂载AudioSource的音效播放器)会被销毁,既无法完整播放音效,也无法实现“播完再切场景”的逻辑。

修正逻辑

要实现预期效果需要做三处调整:

  • 增加触发标记,避免按键检测重复触发流程
  • 用协程做异步等待,等音频完整播放完再执行场景加载
  • 标记音频播放器对象为跨场景不销毁,避免场景切换时音频被强制中断
修正后完整代码
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Play_Sound : MonoBehaviour
{
    public AudioSource soundPlayer;
    private bool _isTriggered = false;

    void Update()
    {
        if (_isTriggered) return;
        
        if (Input.anyKeyDown)
        {
            _isTriggered = true;
            Play_This_Sound();
            StartCoroutine(WaitForSoundEndAndLoadScene());
        }
    }

    public void Play_This_Sound()
    {
        soundPlayer.Play();
    }

    private IEnumerator WaitForSoundEndAndLoadScene()
    {
        // 防止切场景时音频对象被销毁导致播放中断
        DontDestroyOnLoad(soundPlayer.gameObject);
        // 等待音频片段的完整时长
        yield return new WaitForSeconds(soundPlayer.clip.length);
        SceneManager.LoadScene(2);
    }
}
使用注意事项
  • 检查Inspector面板中soundPlayer绑定的AudioSource组件,必须提前赋值好要播放的AudioClip资源,否则获取音频长度时会触发空引用错误
  • 如果音频本身设置了开始播放的偏移,需要对应调整等待时长,保证等待时间和实际音频播放时长匹配
  • 新场景加载完成后如果不需要保留这个全局音频对象,可以在新场景的脚本中手动销毁,避免产生冗余对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:27:19