2017-01-02 49 views
1

我有一个GameManager脚本,用于管理加载场景,在场景中放置角色,从游戏对象中读取地图信息等等。 GameManager脚本设置为DontDestroyOnLoad获取新场景的儿童

我试图找出如何在加载新场景后从GameManager访问我的新场景中的对象。我正在使用SceneManager.sceneLoaded事件来运行我的“场景初始化”代码。这里的事件处理程序:

void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode) 
{ 
    // I want to access GameObjects within the newly loaded scene here 
    // 
    // SceneManager.GetActiveScene().GetRootGameObjects() returns    
    // System.ArgumentException: the scene is not loaded 

    // I want to do something like this 
    foreach (MapFeature mapFeature in rootObject.GetComponentsInChildren<MapFeature>()) 
    { 
     // Do something 
    } 
} 

我想要得到的新场景的根级别GameObject,然后是根对象上使用GetComponentInChildren,以动态地抢在现场各个部件并将它们存储在GameManager 。但SceneManager.GetActiveScene().GetRootGameObjects()返回System.ArgumentException: the scene is not loaded

如何从我的GameManager中新加载的场景中获取对象?如果有一种比获取新场景的根对象更好的方法并使用它来获取它的子项,我就会全神贯注。

回答

2

这似乎是可能的解决方法,其中sceneLoaded事件启动等待下一帧的协同程序。下面的相关代码片段。

仅供参考,我读到这线程unityforums,最近:https://forum.unity3d.com/threads/scenemanager-sceneloaded-event-when-fired-checking-scene-isloaded-false.429659/

void Awake() { 
    instance = this; 
    DontDestroyOnLoad (gameObject); 
    SceneManager.sceneLoaded += OnSceneLoadedWrapper; 
} 
void OnSceneLoadedWrapper(Scene scene, LoadSceneMode mode) { 
    StartCoroutine ("OnSceneLoaded"); 
} 

IEnumerator OnSceneLoaded(){ 
    yield return new WaitForEndOfFrame(); 
    Scene scene = SceneManager.GetActiveScene(); 
    int count = scene.GetRootGameObjects().Length; 
    string name = scene.GetRootGameObjects()[0].name; 
    Debug.LogFormat ("{0} root objects in Scene, first one called {1}", count, name); 
} 
+0

感谢。看起来也许事件是以错误的顺序被解雇的,所以'sceneLoaded'在新场景的初始事件之前被触发? –