場景轉換服務 — MRTK2

此延伸模組可簡化淡出場景、顯示進度指示器、載入場景,然後淡回場景的商務。

場景作業是由 SceneSystem 服務所驅動,但任何以工作為基礎的作業都可以用來驅動轉換。

啟用擴充功能

若要啟用擴充功能,請開啟您的 RegisteredServiceProvider 設定檔。 按一下 [註冊新的服務提供者] 以新增設定。 在 [元件類型] 欄位中,選取 [SceneTransitionService]。 在 [組態設定檔] 欄位中,選取延伸模組隨附的預設場景轉換設定檔。

設定檔選項

使用預設進度指示器

如果核取,在呼叫 DoSceneTransition. 時未提供進度指標物件時,將會使用預設進度指示器預製物件。如果提供進度指標物件,則會忽略預設值。

使用淡出色彩

如果核取,轉換服務會在轉換期間套用淡化。 此設定可透過服務的 UseFadeColor 屬性在執行時間變更。

淡出色彩

控制淡出效果的色彩。 Alpha 會遭到忽略。 此設定可以在執行時間透過服務的 FadeColor 屬性進行轉換之前變更。

淡出目標

控制哪些相機會套用淡化效果。 此設定可透過服務的 FadeTargets 屬性在執行時間變更。

設定 目標相機
主要區段 將淡化效果套用至主相機。
UI 將淡化效果套用至 UI 層上的相機。 (不會影響重迭 UI)
全部 適用于主要和 UI 相機。
Custom 適用于透過 提供的一組自訂相機 SetCustomFadeTargetCameras

淡出時間/淡入時間

在進入/結束轉換時淡化期間的預設設定。 這些設定可以透過服務的 FadeOutTimeFadeInTime 屬性在執行時間變更。

相機淡出器類型

ICameraFader 用於將淡化效果套用至相機的類別。 預設 CameraFaderQuad 類別會在靠近裁剪平面的目標相機前面具現化具有透明材質的四邊形。 另一種方法可能是使用後置效果系統。

使用延伸模組

您可以傳遞相機淡出時執行的工作,以使用轉換服務。

使用場景系統工作

在大部分情況下,您將使用 SceneSystem 服務所提供的工作:

private async void TransitionToScene()
{
    IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Runs LoadContent task
    // Fades back in
    await transition.DoSceneTransition(
            () => sceneSystem.LoadContent("TestScene1")
        );
}

使用自訂工作

在其他情況下,您可能想要執行轉換而不實際載入場景:

private async void TransitionToScene()
{
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Resets scene
    // Fades back in
    await transition.DoSceneTransition(
            () => ResetScene()
        );
}

private async Task ResetScene()
{
    // Go through all enemies in the current scene and move them back to starting positions
}

或者,您可能想要在不使用 SceneSystem 服務的情況下載入場景:

private async void TransitionToScene()
{
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Loads scene using Unity's scene manager
    // Fades back in
    await transition.DoSceneTransition(
            () => LoadScene("TestScene1")
        );
}

private async Task LoadScene(string sceneName)
{
    AsyncOperation asyncOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
    while (!asyncOp.isDone)
    {
        await Task.Yield();
    }
}

使用多個工作

您也可以提供多個工作,這會依序執行:

private async void TransitionToScene()
{
    IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Sets time scale to 0
    // Fades out audio to 0
    // Loads TestScene1
    // Fades in audio to 1
    // Sets time scale to 1
    // Fades back in
    await transition.DoSceneTransition(
            () => SetTimescale(0f),
            () => FadeAudio(0f, 1f),
            () => sceneSystem.LoadContent("TestScene1"),
            () => FadeAudio(1f, 1f),
            () => SetTimescale(1f)
        );
}

private async Task SetTimescale(float targetTime)
{
    Time.timeScale = targetTime;
    await Task.Yield();
}

private async Task FadeAudio(float targetVolume, float duration)
{
    float startTime = Time.realtimeSinceStartup;
    float startVolume = AudioListener.volume;
    while (Time.realtimeSinceStartup < startTime + duration)
    {
        AudioListener.volume = Mathf.Lerp(startVolume, targetVolume, Time.realtimeSinceStartup - startTime / duration);
        await Task.Yield();
       }
       AudioListener.volume = targetVolume;
}

使用進度指標

進度指標是實作 IProgressIndicator 介面的任何專案。 這可以是啟動顯示畫面、3D 標籤along 載入指示器,或提供轉換進度意見反應的任何其他專案。

如果在 UseDefaultProgressIndicator SceneTransitionService 設定檔中核取,轉換開始時將會具現化進度指示器。 在轉換期間,您可以透過該服務 SetProgressValue 的 和 方法來存取此指標 Progress 的 和 MessageSetProgressMessage 屬性。

private async void TransitionToScene()
{
    IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    ListenToSceneTransition(sceneSystem, transition);

    await transition.DoSceneTransition(
            () => sceneSystem.LoadContent("TestScene1")
        );
}

private async void ListenToSceneTransition(IMixedRealitySceneSystem sceneSystem, ISceneTransitionService transition)
{
    transition.SetProgressMessage("Starting transition...");

    while (transition.TransitionInProgress)
    {
        if (sceneSystem.SceneOperationInProgress)
        {
            transition.SetProgressMessage("Loading scene...");
            transition.SetProgressValue(sceneSystem.SceneOperationProgress);
        }
        else
        {
            transition.SetProgressMessage("Finished loading scene...");
            transition.SetProgressValue(1);
        }

        await Task.Yield();
    }
}

或者,呼叫 DoSceneTransition 時,您可以透過選擇性 progressIndicator 引數提供自己的進度指示器。 這會覆寫預設進度指標。