Unity 2022.1.24中GetRootGameObjects返回空数组问题求助
Unity 2022.1.24调用GetRootGameObjects返回空数组的原因排查
你的测试代码如下:
class Overlay : MonoBehaviour { void OnGUI() { string text = $"{SceneManager.GetActiveScene().GetRootGameObjects().Length}"; GUI.Box(new Rect(10, 10, Screen.width - 20, 20), text); } }
运行后显示根对象数量为0,但场景内对象可正常工作,可能的原因如下:
场景未完全加载就执行了方法
OnGUI会在每帧触发,如果Overlay脚本所在对象在目标场景加载完成前就已激活,此时调用GetRootGameObjects会返回空。建议改用SceneManager.sceneLoaded回调,确保在场景加载完成后再获取根对象:void Start() { SceneManager.sceneLoaded += OnSceneLoaded; } void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (scene == SceneManager.GetActiveScene()) { int rootCount = scene.GetRootGameObjects().Length; Debug.Log($"当前场景根对象数量:{rootCount}"); } }活动场景与目标场景不匹配
如果同时加载了多个场景,GetActiveScene()返回的可能不是你存放对象的场景。可以直接通过场景名获取目标场景:Scene targetScene = SceneManager.GetSceneByName("你的场景名称"); int rootCount = targetScene.GetRootGameObjects().Length;也可以在编辑器Scene窗口确认当前活动场景的名称,确保与预期一致。
根对象被移至Persistent场景
若场景中的对象被调用过DontDestroyOnLoad,这些对象会被转移到Unity的Persistent Scene中,不再属于原场景。此时需要通过索引0获取Persistent Scene来访问这类对象:Scene persistentScene = SceneManager.GetSceneAt(0); int persistentRootCount = persistentScene.GetRootGameObjects().Length;Unity版本存在已知bug
Unity 2022.1.x属于迭代版本,可能存在场景相关的兼容性bug。建议升级到同系列的稳定版本(如2022.1.30及以上),或切换到LTS版本(如2021.3.x)测试问题是否消失。根对象被设置为隐藏标记
如果场景中的根对象被设置了HideFlags.HideInHierarchy,GetRootGameObjects会忽略它们。可以通过遍历所有对象验证是否存在这类隐藏根对象:foreach (GameObject obj in FindObjectsOfType<GameObject>(true)) { if (obj.transform.parent == null) { Debug.Log($"检测到根对象:{obj.name},隐藏标记:{obj.hideFlags}"); } }
内容的提问来源于stack exchange,提问作者Landsailor
相关产品推荐
相关产品推荐

