【发布时间】:2021-04-20 15:05:20
【问题描述】:
我需要等到场景完全加载后才能将 gameObject 从 DontDestroyOnLoad 场景移动到它。如果我做得太早(就在调用SceneManager.LoadScene() 之后),那么gameObject 就会消失。基于this post我实现了一个场景加载类来解决这个问题:
public static class CustomSceneManager
{
public delegate void SceneChange(string sceneName);
public static event SceneChange LoadScene;
public static event SceneChange UnloadScene;
private static IEnumerator LoadLevel (string sceneName){
var asyncLoadLevel = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
while (!asyncLoadLevel.isDone){
Debug.Log("Loading the Scene");
yield return null;
}
}
public static void OnLoadScene(string newSceneName)
{
OnUnloadScene(newSceneName);
LoadLevel(newSceneName);
LoadScene?.Invoke(newSceneName);
}
private static void OnUnloadScene(string newSceneName)
{
UnloadScene?.Invoke(newSceneName);
}
}
我从中调用了两个事件(LoadScene 和 UnloadScene)。但是 LoadLevel(newSceneName) 不起作用 - 它根本不加载场景。我在这里做错了什么?
编辑:
现在我正在传递调用 OnLoadScene 方法的脚本的 MonoBehavior 引用,如下所示:
public static void OnLoadScene(MonoBehaviour loader, string newSceneName)
{
UnloadScene?.Invoke(newSceneName);
loader.StartCoroutine(LoadLevel(newSceneName));
Debug.Log(SceneManager.GetActiveScene().name); // this line returns previous scene
LoadScene?.Invoke(newSceneName);
}
现在场景加载了,但是当我检查当前加载的场景时,它会返回之前的场景名称。
编辑 2:
更准确地说,我将Debug.Log(SceneManager.GetActiveScene().name); 替换为Debug.Log(SceneManager.GetSceneByName(newSceneName).isLoaded); 并返回False。
【问题讨论】:
-
你必须使用
StartCoroutine(LoadLevel(newSceneName);运行协程 -
@derHugo 这是一个静态类。有没有其他办法?
-
@derHugo 谢谢,这有助于加载场景,但协程似乎无法正常工作。
-
SceneManager没有SceneLoaded事件吗? -
@Immersive 根据我的测试,它在场景完全加载之前被调用,因此将
gameObject移动到该场景不起作用。