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

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;
    }
}

操作步骤

  1. 把这个脚本挂到每个场景的音乐对象上
  2. 选中音乐对象,在Inspector面板里把targetSceneIndex改成对应场景的build索引(比如场景1就填1)
  3. 每个场景只保留一个音乐对象,无需创建多个脚本,复用这个即可

原代码问题说明

原代码只在Awake阶段判断一次场景索引,旧音乐因为被DontDestroyOnLoad标记,切换场景后不会自动销毁,也没有后续逻辑检查新场景的情况,所以会持续播放。上面的代码通过监听场景加载事件,在场景切换完成后主动判断是否需要销毁,解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:15:59