Unity场景已加入Build Settings但加载时报未添加错误该如何解决?
问题根因
你遇到的报错:
Scene '/Assets/Beach_Essentials/DemoScene' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded
1. 加载参数不匹配
SceneManager.LoadScene传入字符串参数时,要求和Build Settings中登记的场景名完全一致:
- 不能包含
/Assets/xxx/这类路径前缀 - 不能带
.unity后缀 - 大小写、空格都要完全匹配
报错信息中的场景路径带了完整的Assets目录前缀,大概率是服务端返回的JSON字段里带了完整路径,和Build Settings里登记的DemoScene名称不匹配,导致Unity认为该场景没有被添加到构建设置中。
2. Update重复触发加载
场景加载不是瞬时完成的,在触发加载到场景切换完成的间隙,current_scene.name != requested_scene的判断依然成立,会导致每帧重复调用LoadScene,也会触发该类报错。
3. 场景存储位置无关
不需要将场景放到特定的「常规环境」或「UI环境」分组下,只要场景出现在Build Settings的Scenes In Build列表中且处于勾选启用状态,无论放在项目的哪个文件夹下都可以正常加载。
解决方案
- 首先校验
requested_scene的实际值,你可以在加载前加一行日志打印该变量的值,和Build Settings中的场景名做对比,去掉多余的路径、后缀即可。如果服务端返回的是完整路径,可以用字符串截取的方式拿到纯场景名:
// 示例:从完整路径中提取纯场景名 requested_scene = root["item"]["asset"].ToString(); // 去掉路径前缀 requested_scene = requested_scene.Split('/')[^1]; // 去掉.unity后缀(如果有的话) if(requested_scene.EndsWith(".unity")) { requested_scene = requested_scene.Substring(0, requested_scene.Length - 6); }
- 给加载逻辑加锁,避免重复调用:
private bool isLoadingScene = false; requested_scene = root["item"]["asset"]; private void Update() { if(requested_scene != "" && !isLoadingScene) { Debug.Log("Try to load scene "+requested_scene); Scene current_scene = SceneManager.GetActiveScene(); if(current_scene.name != requested_scene) { isLoadingScene = true; SceneManager.LoadScene(requested_scene); Debug.Log("Scene loaded"+requested_scene); } } //rest of the code } // 场景加载完成后重置加载锁 private void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; } private void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { isLoadingScene = false; }
- 也可以提前维护一份场景名和Build Settings索引的映射表,通过索引加载场景,彻底避免字符串匹配错误。
内容的提问来源于stack exchange,提问作者SARL
相关产品推荐
相关产品推荐

