Szenenübergangsdienst – MRTK2

Diese Erweiterung vereinfacht das Ausblenden einer Szene, das Anzeigen einer Statusanzeige, das Laden einer Szene und das Wiedereinblenden.

Szenenvorgänge werden vom SceneSystem-Dienst gesteuert, aber jeder vorgangsbasierte Vorgang kann verwendet werden, um einen Übergang zu fördern.

Aktivieren der Erweiterung

Um die Erweiterung zu aktivieren, öffnen Sie Ihr RegisteredServiceProvider-Profil. Klicken Sie auf "Registrieren eines neuen Dienstanbieters", um eine neue Konfiguration hinzuzufügen. Wählen Sie im Feld "Komponententyp" die Option "SceneTransitionService" aus. Wählen Sie im Feld "Konfigurationsprofil" das Standardprofil des Szenenübergangs aus, das in der Erweiterung enthalten ist.

Profiloptionen

Standardstatusanzeige verwenden

Wenn aktiviert, wird der Standardstatusindikator prefab verwendet, wenn beim Aufrufen DoSceneTransition. eines Statusanzeigeobjekts kein Statusindikatorobjekt bereitgestellt wird, wird der Standardwert ignoriert.

Verwenden der Farbe "Einblenden"

Wenn aktiviert, wendet der Übergangsdienst während des Übergangs eine Einblendung an. Diese Einstellung kann zur Laufzeit über die Eigenschaft des Diensts UseFadeColor geändert werden.

Farbe ausblenden

Steuert die Farbe des Fadeneffekts. Alpha wird ignoriert. Diese Einstellung kann zur Laufzeit vor einem Übergang über die Eigenschaft des Diensts FadeColor geändert werden.

Ziele ausblenden

Steuert, welche Kameras auf sie angewendet werden. Diese Einstellung kann zur Laufzeit über die Eigenschaft des Diensts FadeTargets geändert werden.

Einstellung Gezielte Kameras
Main Wendet den Fadeneffekt auf die Hauptkamera an.
Benutzeroberfläche Wendet den Einblendeffekt auf Kameras auf der UI-Ebene an. (Wirkt sich nicht auf die Überlagerungs-UI aus)
All Gilt für Haupt- und UI-Kameras.
Benutzerdefiniert Gilt für einen benutzerdefinierten Satz von Kameras, die über SetCustomFadeTargetCameras

Zeit ausblenden/einblenden

Standardeinstellungen für die Dauer einer Einblendung beim Eingeben/Beenden eines Übergangs. Diese Einstellungen können zur Laufzeit über die Eigenschaften und FadeInTime Eigenschaften des Diensts FadeOutTime geändert werden.

Kamera Fadertyp

Welche ICameraFader Klasse zum Anwenden eines Fadeneffekts auf Kameras verwendet werden soll. Die Standardklasse CameraFaderQuad instanziiert ein Quad mit einem transparenten Material vor der Zielkamera in der Nähe der Clipebene. Ein anderer Ansatz könnte sein, ein Nacheffektsystem zu verwenden.

Verwenden der Erweiterung

Sie verwenden den Übergangsdienst, indem Sie Aufgaben übergeben, die ausgeführt werden, während die Kamera ausgeblendet wird.

Verwenden von Szenensystemaufgaben

In den meisten Fällen verwenden Sie Aufgaben, die vom SceneSystem-Dienst bereitgestellt werden:

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")
        );
}

Verwenden von benutzerdefinierten Aufgaben

In anderen Fällen möchten Sie möglicherweise einen Übergang ausführen, ohne tatsächlich eine Szene zu laden:

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
}

Oder Sie möchten eine Szene laden, ohne den SceneSystem-Dienst zu verwenden:

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();
    }
}

Verwenden mehrerer Aufgaben

Sie können auch mehrere Aufgaben bereitstellen, die in der Reihenfolge ausgeführt werden:

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;
}

Verwenden des Statusindikators

Ein Statusindikator ist alles, was die IProgressIndicator Schnittstelle implementiert. Dies kann in Form eines Begrüßungsbildschirms, eines 3D-Tagalong-Ladeindikators oder eines anderen Objekts erfolgen, das Feedback zum Fortschritt des Übergangs liefert.

Wenn UseDefaultProgressIndicator das SceneTransitionService-Profil eingecheckt ist, wird ein Statusindikator instanziiert, wenn ein Übergang beginnt. Für die Dauer des Übergangs kann auf die Eigenschaften und Message Eigenschaften dieses Indikators Progress über diese Dienste SetProgressValue und SetProgressMessage Methoden zugegriffen werden.

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();
    }
}

Alternativ können Sie beim Aufrufen DoSceneTransition ihre eigene Statusanzeige über das optionale progressIndicator Argument angeben. Dadurch wird der Standardstatusindikator überschreiben.