1

我遇到了这篇文章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() 函数?

4

0 回答 0