Freigeben über


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

Um die Erweiterung zu aktivieren, öffnen Sie Ihr RegisteredServiceProvider-Profil. 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 Standard-Szenenübergangsprofil aus, das in der Erweiterung enthalten ist.

Profiloptionen

Standardstatusanzeige verwenden

Wenn diese Option aktiviert ist, wird das Standard-Prefab für die Statusanzeige verwendet, wenn beim Aufrufen DoSceneTransition. von If a progress indicator object is provided (Wenn ein Statusanzeigenobjekt bereitgestellt wird) kein Statusanzeigeobjekt bereitgestellt wird. Die Standardeinstellung wird ignoriert.

Verwenden der Einblendungsfarbe

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.

Farbe ausblenden

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

Ziele ausblenden

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

Einstellung Zielkameras
Hauptsächlich Wendet den Einblendungseffekt auf die Standard Kamera an.
Benutzeroberfläche Wendet den Einblendungseffekt auf Kameras auf der Ui-Ebene an. (Wirkt sich nicht auf die Überlagerungs-Benutzeroberfläche aus)
Alle Gilt sowohl für Standard- als auch für Benutzeroberflächenkameras.
Benutzerdefiniert Gilt für eine benutzerdefinierte Gruppe von Kameras, die über bereitgestellt werden SetCustomFadeTargetCameras

Ausblendzeit/Einblenden in der Zeit

Standardeinstellungen für die Dauer einer Einblendung beim Eintreten/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 Ausblendeffekts 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 Tasks übergeben, die ausgeführt werden, während die Kamera ausgeblendet ist.

Verwenden von Szenensystemaufgaben

In den meisten Fällen verwenden Sie Tasks, 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 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 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 in Form eines Begrüßungsbildschirms, eines 3D-Tagalong-Ladeindikators oder anderer Elemente erfolgen, die Feedback zum Übergangsfortschritt geben.

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 Message des Indikators Progress über die Methoden und dieses SetProgressMessage Diensts SetProgressValue 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 eine eigene Statusanzeige über das optionale progressIndicator Argument angeben. Dadurch wird die Standardstatusanzeige außer Kraft gesetzt.