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
相关产品推荐
相关产品推荐

