我遇到了这篇文章Multi-scene editing,并且在提示和技巧部分的底部,有以下句子:“建议避免使用 DontDestroyOnLoad 来持久化您希望在跨场景加载时生存的管理器游戏对象。相反,创建经理场景”。我决定尝试一下,因为我当前的游戏有一个使用 DontDestroyOnload() 的管理器。
现在说我有 3 个场景:1) StartScene 2) Manager 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 输出)
这意味着Level_01场景的Start()函数是在设置CurrentlyActiveScene之前调用的,并且CurrentActiveScene只设置在后面的帧上。
问题:如何确保仅在设置 CurrentActiveScene 后才调用 Start() 函数?