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

Unity 2D场景切换时背景音乐重复播放问题求助

Unity 2D 背景音乐重复播放问题解决方法

问题出在每次加载主菜单场景时,场景内的音乐对象会被重新创建,而之前的音乐对象因为DontDestroyOnLoad被保留,导致两个实例同时播放。你需要用单例模式确保整个游戏中只有一个音乐对象实例存在。

修改后的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MusicRandom : MonoBehaviour
{
    [SerializeField] AudioClip[] myAudioClips;
    AudioSource audioSource;
    // 静态实例,用于全局唯一引用
    private static MusicRandom instance;

    void Awake()
    {
        // 单例逻辑:如果已有实例,销毁当前对象
        if (instance != null && instance != this)
        {
            Destroy(gameObject);
            return;
        }
        // 设置当前实例为全局单例,并标记不随场景销毁
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    void Start() 
    {
        audioSource = gameObject.GetComponent<AudioSource>();
        // 如果当前没有播放音乐,直接开始随机播放
        if (!audioSource.isPlaying)
        {
            audioSource.clip = RandomClip();
            audioSource.Play();
        }
    }

    AudioClip RandomClip() 
    {
        int randomNumber = Random.Range(0, myAudioClips.Length);
        return myAudioClips[randomNumber];
    }

    void Update() 
    {
        if (!audioSource.isPlaying) {
            audioSource.clip = RandomClip();
            audioSource.Play();
        }
    }
}

关键说明:

  1. Awake方法的单例逻辑:在对象初始化时检查是否已有全局实例,若有则直接销毁当前对象,避免重复创建;若没有则将自身设为全局实例并保留。
  2. 调整Start方法:添加了首次播放的判断,确保进入游戏时音乐能自动开始。
  3. 保留了你原本的随机播放逻辑,不影响原有功能。

这样修改后,无论多少次切换回主菜单场景,都只会保留最初创建的那个音乐对象,不会出现两首音乐同时播放的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:10:28