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.