Szenenübergangsdienst – MRTK2

Diese Erweiterung vereinfacht das Ausblenden einer Szene, das Anzeigen einer Statusanzeige, das Laden einer Szene und das anschließende Wiederverblenden.

Szenenvorgänge werden vom SceneSystem-Dienst gesteuert, aber jeder taskbasierte Vorgang kann verwendet werden, um einen Übergang zu steuern.

Aktivieren der Erweiterung

Öffnen Sie ihr RegisteredServiceProvider-Profil, um die Erweiterung zu aktivieren. Klicken Sie auf Neuen Dienstanbieter registrieren, um eine neue Konfiguration hinzuzufügen. Wählen Sie im Feld Komponententyp die Option SceneTransitionService aus. Wählen Sie im Feld Konfigurationsprofil das standardmäßige Szenenübergangsprofil aus, das in der Erweiterung enthalten ist.

Profiloptionen

Standardstatusanzeige verwenden

Wenn dies aktiviert ist, wird das Standard-Statusanzeige-Prefab verwendet, wenn beim Aufrufen DoSceneTransition. von If a progress indicator object (Wenn ein Statusindikatorobjekt bereitgestellt wird) kein Statusanzeigeobjekt bereitgestellt wird, wird die Standardeinstellung ignoriert.

Verwenden der Fadenfarbe

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

Einblenden der Farbe

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

Einblenden von Zielen

Steuert, welche Kameras einen Einblendeneffekt haben. Diese Einstellung kann zur Laufzeit über die -Eigenschaft des Diensts FadeTargets geändert werden.

Einstellung Zielkameras
Main Wendet den Einblendeffekt auf die Standard-Kamera an.
Benutzeroberfläche Wendet den Einblendeffekt auf Kameras auf der UI-Ebene an. (Wirkt sich nicht auf die Überlagerungs-Benutzeroberfläche aus)
Alle Gilt sowohl für Standard- als auch benutzeroberflächenkameras.
Benutzerdefiniert Gilt für einen benutzerdefinierten Satz von Kameras, die über bereitgestellt werden SetCustomFadeTargetCameras

Ausblendzeit/Einblenden in der Zeit

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

Kamera-Fadertyp

Welche ICameraFader Klasse zum Anwenden eines Einblendeneffekts 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 die Verwendung eines Post effects-Systems sein.

Verwenden der Erweiterung

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

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 können Sie einen Übergang durchführen, ohne eine Szene tatsächlich 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 angeben, die in der folgenden 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 der Statusanzeige

Eine Statusanzeige ist alles, was die IProgressIndicator -Schnittstelle implementiert. Dies kann die Form eines Begrüßungsbildschirms, eines 3D-Tagalong-Ladeindikators oder eines anderen Objekts haben, das Feedback zum Übergangsfortschritt liefert.

Wenn UseDefaultProgressIndicator im SceneTransitionService-Profil aktiviert ist, wird eine Statusanzeige instanziiert, wenn ein Übergang beginnt. Für die Dauer des Übergangs kann auf die Eigenschaften und des Indikators Progress über die Methoden und SetProgressMessage dieses Diensts SetProgressValue zugegriffen werden.Message

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 ihren eigenen Statusindikator über das optionale progressIndicator Argument angeben. Dadurch wird der Standardstatusindikator außer Kraft gesetzt.