2017-01-02 2 views
1

У меня есть сценарий GameManager, который управляет загрузкой сцен, помещением символов в сцену, чтением информации о карте из игровых объектов и т. Д. Сценарий GameManager установлен в DontDestroyOnLoad.Get Children of New Scene

Я пытаюсь выяснить, как получить доступ к объектам в моей новой сцене с 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 Event запускает сопрограмму, ожидающую следующего кадра. Соответствующий фрагмент ниже.

Для справки, я прочитал эту тему на 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' запускается перед исходными событиями новой сцены? –