我有一个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
内的新加载场景中获取对象?如果有一个更好的方法,而不是获取新场景的根对象并使用它来获取它的孩子,我很满意。
答案 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);
}