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
相关产品推荐
相关产品推荐

