让新场景的孩子们

时间:2017-01-02 19:32:12

标签: unity3d

我有一个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,以便动态抓取场景中的各种组件并将它们存储在{{ 1}}。但是,GameManager会返回SceneManager.GetActiveScene().GetRootGameObjects()

如何在System.ArgumentException: the scene is not loaded内的新加载场景中获取对象?如果有一个更好的方法,而不是获取新场景的根对象并使用它来获取它的孩子,我很满意。

1 个答案:

答案 0 :(得分: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);
}