如何正确地重新加载使用 MRTK 的 Hololens2 的 Unity 场景?

How do I properly reload a Unity Scene that uses MRTK for the Hololens2?

这是我使用 Hololens 和 MRTK for Unity 的第一个项目。我想制作一个按钮,在按下时重新启动播放器的体验。

我使用以下代码将按钮连接到新脚本:

SceneManager.LoadScene(SceneManager.GetActiveScene().name);

按下按钮时,场景似乎重新加载,但所有 MRTK/Hololens 功能都停止了。手和眼球追踪没有反应,我无法与全息图互动。

我知道我可以手动制作一个重置方法来移动场景中的所有对象并重置特定脚本,但我正在尝试通过推送来完全卸载和重新加载尽可能多的 Unity 应用程序按钮。

那么,如何在 Hololens2 上正确地重新加载 Unity 场景?我仍在对此进行研究,并将更新我在这里找到的内容。非常感谢这里的任何帮助,谢谢!

总是因为 MRTK 的此类问题而避免使用它。


我更愿意建议:

在构建索引 0 有一个 MRTK 和着陆场景。这个你永远不会卸载或重新加载。您还可以在此处放置负责(重新)加载内容的管理器脚本。

并通过 additive scene loading 加载其他所有内容,然后仅卸载并重新加载这些额外的场景。

这会使 MRTK 完好无损,您仍然可以加载、卸载和重新加载您的应用程序内容。


提到的经理 class 可能有点像

// Put this into the MRTK scene
public class SceneLoader : MonoBehaviour
{
    private void Awake ()
    {
        // Register callback for everytime a new scene is loaded
        SceneManager.sceneLoaded += OnSceneLoaded;

        // Initially load the second scene additive
        SceneManager.LoadScene(1, LoadSceneMode.Additive);
    }

    // Called when a new scene was loaded
    private void OnSceneLoaded(Scene scene, LoadSceneMode loadMode) 
    {
        if(loadMode == LoadSceneMode.Additive)
        {
            // Set the additive loaded scene as active
            // So new instantiated stuff goes here
            // And so we know which scene to unload later
            SceneManager.SetActiveScene(scene);
        }
    }
        

    public static void ReloadScene()
    {
        var currentScene = SceneManager.GetActiveScene();
        var index = currentScene.buildIndex;

        SceneManager.UnloadScene(currentScene);

        SceneManager.LoadScene(index, LoadSceneMode.Additive);
    }

    public static void LoadScene(string name)
    {
        var currentScene = SceneManager.GetActiveScene();

        SceneManager.UnloadScene(currentScene);

        SceneManager.LoadScene(name, LoadSceneMode.Additive);
    }

    public static void LoadScene(int index)
    {
        var currentScene = SceneManager.GetActiveScene();

        SceneManager.UnloadScene(currentScene);

        SceneManager.LoadScene(index, LoadSceneMode.Additive);
    }
}

然后重新加载当前场景

SceneLoader.ReloadScene();

或像往常一样通过

加载不同的场景
SceneLoader.LoadScene("SceneName");

SceneLoader.LoadScene(buildIndex);

当然,您也可以按照 API 示例实现异步版本。

MRTK 实际上有一个场景系统,可以巧妙地包裹 loading/unloading 场景以及可选的概念,如照明。

看看这里的 docs/guides:https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/SceneSystem/SceneSystemGettingStarted.html