2017-01-02 80 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'在新場景的初始事件之前被觸發? –