Unity场景重置后调用音频函数失效的问题排查与解决
问题:调用场景重置函数后无法播放音频的原因及解决办法
我通过按钮调用restartGame()函数重置Unity场景,但函数内的CanI()音频播放函数始终无法播放音频。已知按钮与CanI()单独使用均正常工作,想知道二者组合后失效的原因及解决办法。
原因分析
- 核心问题是
SceneManager.LoadScene(SceneManager.GetActiveScene().name)会立即触发当前场景的卸载:包括挂载LogicScript的游戏对象、它的AudioSource组件都会被销毁。 - 你在调用
LoadScene之后才执行CanI(),此时代码虽然会执行,但AudioSource已经不存在,自然无法播放音频;就算侥幸执行,场景加载完成后新的场景实例会覆盖当前状态,音频播放也会被直接打断。
解决办法
方案1:等待音频播放完毕后再加载场景
利用协程等待音频时长,确保音频播放完成后再切换场景:
public void restartGame() { CanI(); // 开启协程等待音频播放完毕后加载场景 StartCoroutine(LoadSceneAfterAudio(sfx3.length)); } private IEnumerator LoadSceneAfterAudio(float delay) { yield return new WaitForSeconds(delay); SceneManager.LoadScene(SceneManager.GetActiveScene().name); }
方案2:把音频播放放到场景加载后的初始化逻辑里
如果需要场景加载完成后播放音频:
- 在
LogicScript中添加Start()方法,场景加载完成后自动触发播放:
void Start() { CanI(); }
- 修改
restartGame(),只保留场景加载逻辑:
public void restartGame() { SceneManager.LoadScene(SceneManager.GetActiveScene().name); }
方案3:让音频对象不随场景销毁
将AudioSource所在的游戏对象设置为DontDestroyOnLoad,场景切换时它不会被销毁,就能正常播放音频:
在LogicScript的Awake()方法中添加:
void Awake() { DontDestroyOnLoad(gameObject); }
注意:可以加单例判断避免场景加载后出现多个重复的音频对象。
原始代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class LogicScript : MonoBehaviour { public int score; public Text scoreText; public GameObject GameOverScreen; [ContextMenu ("add score")] public void addScore(int scoreToAdd) { score += scoreToAdd; scoreText.text = score.ToString() +" Majors"; } public void restartGame() { SceneManager.LoadScene(SceneManager.GetActiveScene().name); CanI(); } public void GameOver() { GameOverScreen.SetActive(true); } public AudioSource src; public AudioClip sfx, sfx2, sfx3, sfx4; public void weMajor() { src.clip = sfx; src.Play(); } public void End() { src.clip = sfx2; src.Play(); } public void CanI() { src.clip = sfx3; src.Play(); } public void Intro() { src.clip = sfx4; src.Play(); } }
内容的提问来源于stack exchange,提问作者swag money wizz jizz
相关产品推荐
相关产品推荐

