我碰到了这篇文章Multi-scene editing,在“技巧和窍门”部分的底部,有以下句子:“建议避免使用DontDestroyOnLoad来持久化要在场景加载中生存的管理器GameObject。而是创建一个经理场景”。 我决定尝试一下,因为我当前的游戏有一个使用DontDestroyOnload()的管理器。
现在说我有3个场景: 1)StartScene 2)经理 3)Level_01
在 StartScene 中,我这样做是为了使管理器从头开始永久加载:
void Start()
{
SceneManager.LoadSceneAsync("Manager", LoadSceneMode.Additive);
}
在 Manager 中,我有一个名为SceneLoader的脚本
在SceneLoader中,我这样做:
void Update()
{
Debug.Log(SceneManager.GetActiveScene().name);
}
public void LoadScene(string sceneName)
{
StartCoroutine(LoadSceneAsync(sceneName));
}
IEnumerator LoadSceneAsync(string sceneName)
{
Scene currentScene = SceneManager.GetActiveScene();
AsyncOperation sceneLoadingOperation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
while(!sceneLoadingOperation.isDone)
{
yield return null;
}
SceneManager.UnloadSceneAsync(currentScene);
SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName));
}
我还有一个名为“开始”的按钮。 当我按下按钮时,将调用LoadScene()方法。
在 Level_01 中,我这样做:
void Start()
{
Debug.Log("Level_01 start called");
}
现在,这是问题: 我希望控制台输出为:
StartScene(由SceneManager.CurrentlyActiveScene输出)
Level_01开始被调用(由Level_01中的Start()输出)
Level_01(由SceneManager.CurrentlyActiveScene输出)
相反,控制台输出是这样的:
StartScene(由SceneManager.CurrentlyActiveScene输出)
Level_01开始被调用(由Level_01中的Start()输出)
StartScene(由SceneManager.CurrentlyActiveScene输出)
Level_01(由SceneManager.CurrentlyActiveScene输出)
这意味着在设置CurrentlyActiveScene之前,将调用Level_01场景的Start()函数,并且仅在以下帧上设置CurrentlyActiveScene。
问题:如何确保仅在设置了CurrentActiveScene之后才调用Start()函数?