2017-01-02 13 views
1

私は、シーンの読み込み、シーン内の文字の挿入、ゲームオブジェクトからの地図情報の読み込みなどを管理するGameManagerスクリプトを持っています。 GameManagerスクリプトはDontDestroyOnLoadに設定されています。新しいシーンの子供たちを取得する

新しいシーンがロードされた後、私は新しいシーン内のオブジェクトにアクセスする方法を把握しようとしています。GameManagerSceneManager.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を取得したい、その後、動的シーンの中の様々な成分をつかむと、GameManagerに格納するために、そのルートオブジェクトにGetComponentInChildrenを使用しています。ただし、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'が起動されるでしょうか? –

関連する問題