2017-01-02 3 views
1

Ich habe ein GameManager Skript, das Ladeszenen verwaltet, Charaktere in die Szene setzt, Karteninformationen aus Spielobjekten liest und so weiter. Das Skript GameManager ist auf DontDestroyOnLoad festgelegt.Erhalte Kinder der neuen Szene

Ich versuche herauszufinden, wie auf Objekte in meiner neuen Szene von GameManager zugegriffen wird, nachdem eine neue Szene geladen wird. Ich verwende das Ereignis SceneManager.sceneLoaded, um meinen "Szeneninitialisierungs" -Code auszuführen. Hier ist der Event-Handler:

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 
    } 
} 

Ich möchte mich das Root-Ebene zu bekommen GameObject der neuen Szene, und verwenden Sie dann GetComponentInChildren auf diesem Stammobjekt, um dynamisch verschiedene Komponenten in der Szene zu greifen und sie in GameManager . SceneManager.GetActiveScene().GetRootGameObjects() gibt jedoch System.ArgumentException: the scene is not loaded zurück

Wie bekomme ich Objekte aus meiner neu geladenen Szene innerhalb meiner GameManager? Wenn es eine bessere Methode gibt, als das Root-Objekt der neuen Szene zu bekommen und damit seine Kinder zu bekommen, bin ich ganz Ohr.

Antwort

2

Dies scheint durch eine Problemumgehung möglich zu sein, bei der das sceneLoaded-Ereignis eine Coroutine startet, die auf den nächsten Frame wartet. Relevanter Ausschnitt unten.

Als Referenz las ich diesen Thread auf unityforums, vor kurzem: 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

Dank. Sieht so aus, als ob die Ereignisse in der falschen Reihenfolge ausgelöst werden, so dass 'sceneLoaded' vor den ersten Events der neuen Szene ausgelöst wird? –