场景完全加载之前调用的Unity start()

时间:2020-01-30 15:13:37

标签: c# unity3d coroutine scene-manager

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

0 个答案:

没有答案