Unity加载下一场景时如何获取当前激活场景的build index?
问题根源
- 脚本挂载的游戏对象未设置跨场景持久化:默认切换场景时,当前场景内的所有游戏对象都会被销毁,你的
LevelSwitch脚本实例也会被清除,所有字段重置为默认值,CurrentSceneBuildIndex始终为0,调用NextLevel时会固定加载索引为3的场景,如果索引3刚好是你当前触发切换的场景,就会出现反复重载的问题。 - 变量赋值时序错误:你调用
SceneManager.LoadScene时,CurrentSceneBuildIndex还未被赋值,你是在触发场景加载之后才把sceneLoaded设为true,这时候旧场景的脚本已经进入销毁流程,Update来不及更新CurrentSceneBuildIndex的值。 - 轮询获取场景索引的方式不可靠:通过Update每帧判断获取场景索引不仅效率低,还容易出现时序偏差,Unity提供了专门的场景加载回调事件可以使用。
修复方案
你可以直接使用以下修改后的代码,核心做了三个改动:① 让脚本挂载的对象跨场景持久化不被销毁;② 订阅场景加载完成事件,自动更新当前场景的build index;③ 初始化时就获取首次启动的场景索引,避免第一次调用切换方法时变量为空。
using UnityEngine; using UnityEngine.SceneManagement; public class LevelSwitch : MonoBehaviour { int CurrentSceneBuildIndex; private void Awake() { // 让当前对象跨场景不被销毁,保证脚本实例一直存在 DontDestroyOnLoad(gameObject); // 订阅场景加载完成事件,每次场景加载完自动触发回调 SceneManager.sceneLoaded += OnSceneLoaded; // 初始化时先获取当前启动场景的索引 CurrentSceneBuildIndex = SceneManager.GetActiveScene().buildIndex; } // 场景加载完成的回调方法 private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { // 直接获取新加载的场景索引,不需要轮询 CurrentSceneBuildIndex = scene.buildIndex; } public void NextLevel() { // 这里判断下索引合法性,避免超过Build Settings里的场景总数报错 if (CurrentSceneBuildIndex + 3 < SceneManager.sceneCountInBuildSettings) { SceneManager.LoadScene(CurrentSceneBuildIndex + 3); } else { Debug.LogWarning("目标场景索引超出Build Settings配置的场景总数"); } } public void LevelSelect() { SceneManager.LoadScene("LevelSelect"); } // 脚本销毁时取消事件订阅,避免内存泄漏 private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } }
额外注意事项
- 确保你的
LevelSwitch脚本只挂载在一个游戏对象上,避免跨场景后出现多个实例冲突 - 确认你Build Settings里已经添加了所有需要用到的场景,且索引顺序符合你的预期
内容的提问来源于stack exchange,提问作者SomeRandomFrog
相关产品推荐
相关产品推荐

