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

Unity开发MusicManager脚本出现CS0841等三类编译错误求助

修复方案

错误1:命名空间引用错误

你当前的命名空间引用using UnityEngine.SceneManager;写法错误,Scene类和SceneManager类均属于UnityEngine.SceneManagement命名空间,将该引用替换为using UnityEngine.SceneManagement;即可解决「类型或命名空间“Scene”找不到」、「当前上下文中不存在名称“SceneManager”」两个报错。

错误2:currentScene变量作用域错误

currentScene是你在Start()方法内部声明的局部变量,仅能在Start方法范围内访问,你在Update()方法中调用currentScene.name超出了它的作用域,所以触发CS0841报错。由于你的MusicManager挂载的对象标记了DontDestroyOnLoad,场景切换时Start不会重复执行,建议直接在需要获取当前场景的位置主动调用SceneManager.GetActiveScene(),避免场景切换后变量缓存失效。

错误3:白名单初始化逻辑顺序错误

你当前是先执行切歌判断,再把不需要切歌的场景添加到DontChangeSongScenes列表,首次运行时白名单为空,判断逻辑会失效,需要把添加白名单的代码移到切歌判断之前。


修复后完整代码

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

public class MusicManager : MonoBehaviour
{
    private AudioSource audiosource;
    public AudioClip[] songs;
    public float volume;
    [SerializeField] private float songsPlayed;
    [SerializeField] private bool[] beenPlayed;

    List<string> DontChangeSongScenes = new List<string>();

    // Start is called before the first frame update
    void Start()
    {
        audiosource = GetComponent<AudioSource>();
        beenPlayed = new bool[songs.Length];

        // 先初始化白名单,再做逻辑判断
        DontChangeSongScenes.Add("Scene_1"); /* 只需复制粘贴该行,将"Scene_1"替换为不需要切换当前播放歌曲的场景名称即可 */
        DontChangeSongScenes.Add("Scene_2");

        // 直接获取当前场景,不用额外缓存变量
        if (!audiosource.isPlaying || !DontChangeSongScenes.Contains(SceneManager.GetActiveScene().name))
            ChangeSong(Random.Range(0, songs.Length));
    }

    // Update is called once per frame
    void Update()
    {
        audiosource.volume = volume;

        // 直接获取当前场景,场景切换后也能正常判断
        if (!audiosource.isPlaying || !DontChangeSongScenes.Contains(SceneManager.GetActiveScene().name))
            ChangeSong(Random.Range(0, songs.Length));

        if (songsPlayed == songs.Length)
        {
            songsPlayed = 0;
            for (int i = 0; i < songs.Length; i++)
            {
                beenPlayed[i] = false;
            }
        }
    }

    public void ChangeSong(int songPicked)
    {
        if (!beenPlayed[songPicked])
        {
            songsPlayed++;
            beenPlayed[songPicked] = true;
            audiosource.clip = songs[songPicked];
            audiosource.Play();
        }
        else
        {
            // 可选优化:如果随机到已播放的歌曲,重新随机选择,而不是直接停止播放
            // ChangeSong(Random.Range(0, songs.Length));
            audiosource.Stop();
        }
    }

    void Awake()
    {
        DontDestroyOnLoad(transform.gameObject);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 04:30:00