Unity场景切换时如何销毁音乐GameObject以更换场景音频
不同场景切换时销毁旧音乐对象的解决办法
核心逻辑
给每个场景的音乐对象绑定对应场景的索引,场景切换完成后自动销毁不属于当前场景的音乐实例,同时保证当前场景的音乐只保留一个,避免重复播放。
可用代码
using UnityEngine; using UnityEngine.SceneManagement; public class MusicManager : MonoBehaviour { // 在Inspector面板里设置这个音乐对应的场景索引 public int targetSceneIndex; private void Awake() { // 先清理同场景的重复音乐实例 MusicManager[] allMusicInstances = FindObjectsOfType<MusicManager>(); foreach (MusicManager music in allMusicInstances) { if (music.targetSceneIndex == targetSceneIndex && music != this) { Destroy(music.gameObject); } } // 监听场景加载完成事件,切换场景时处理旧音乐 SceneManager.sceneLoaded += OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { // 如果当前音乐对应的场景不是刚加载的场景,就销毁自己 if (scene.buildIndex != targetSceneIndex) { SceneManager.sceneLoaded -= OnSceneLoaded; // 先解绑监听,防止内存泄漏 Destroy(gameObject); } } private void OnDestroy() { // 对象销毁时解绑监听,避免内存泄漏 SceneManager.sceneLoaded -= OnSceneLoaded; } }
操作步骤
- 把这个脚本挂到每个场景的音乐对象上
- 选中音乐对象,在Inspector面板里把
targetSceneIndex改成对应场景的build索引(比如场景1就填1) - 每个场景只保留一个音乐对象,无需创建多个脚本,复用这个即可
原代码问题说明
原代码只在Awake阶段判断一次场景索引,旧音乐因为被DontDestroyOnLoad标记,切换场景后不会自动销毁,也没有后续逻辑检查新场景的情况,所以会持续播放。上面的代码通过监听场景加载事件,在场景切换完成后主动判断是否需要销毁,解决了这个问题。
内容的提问来源于stack exchange,提问作者Saunved Palve
相关产品推荐
相关产品推荐

