Usługa przejścia sceny — MRTK2
To rozszerzenie upraszcza działalność w celu zanikania sceny, wyświetlania wskaźnika postępu, ładowania sceny, a następnie zanikania z powrotem.
Operacje sceny są sterowane przez usługę SceneSystem, ale każdą operację opartą na zadaniach można użyć do przeniesienia.
Włączanie rozszerzenia
Aby włączyć rozszerzenie, otwórz profil RegisteredServiceProvider. Kliknij pozycję Zarejestruj nowego dostawcę usług, aby dodać nową konfigurację. W polu Typ składnika wybierz pozycję SceneTransitionService. W polu Profil konfiguracji wybierz domyślny profil przejścia sceny dołączony do rozszerzenia.
Opcje profilu
Użyj domyślnego wskaźnika postępu
Jeśli jest zaznaczone, domyślny prefab wskaźnika postępu będzie używany, gdy podczas wywoływania DoSceneTransition.
obiektu wskaźnika postępu nie zostanie podany obiekt wskaźnika postępu, wartość domyślna zostanie zignorowana.
Użyj koloru wyblakłego
Jeśli to pole wyboru, usługa przejścia zastosuje zanikanie podczas przejścia. To ustawienie można zmienić w czasie wykonywania za pośrednictwem właściwości usługi UseFadeColor
.
Kolor zanikania
Steruje kolorem efektu zanikania. Alfa jest ignorowana. To ustawienie można zmienić w czasie wykonywania przed przejściem za pośrednictwem właściwości usługi FadeColor
.
Zanikanie obiektów docelowych
Kontrolki, które kamery będą miały zastosowanie do nich efekt zanikania. To ustawienie można zmienić w czasie wykonywania za pośrednictwem właściwości usługi FadeTargets
.
Ustawienie | Kamery docelowe |
---|---|
Główne | Stosuje efekt zanikania do głównego aparatu. |
Interfejs użytkownika | Stosuje efekt zanikania do kamer w warstwie interfejsu użytkownika. (Nie ma wpływu na interfejs użytkownika nakładki) |
Wszystko | Dotyczy zarówno aparatów głównych, jak i aparatów interfejsu użytkownika. |
Niestandardowy | Dotyczy niestandardowego zestawu kamer udostępnianych za pośrednictwem SetCustomFadeTargetCameras |
Zanikanie czasu / zanikanie w czasie
Domyślne ustawienia czasu trwania zanikania podczas wprowadzania/zamykania przejścia. Te ustawienia można zmienić w czasie wykonywania za pośrednictwem właściwości i FadeInTime
usługiFadeOutTime
.
Typ fadera aparatu
Która ICameraFader
klasa ma być używana do stosowania efektu zanikania do kamer. Domyślna CameraFaderQuad
klasa tworzy wystąpienie czworokąta z przezroczystym materiałem przed kamerą docelową w pobliżu płaszczyzny klipu. Innym rozwiązaniem może być użycie systemu efektów post.
Korzystanie z rozszerzenia
Usługa przejścia jest używana przez przekazanie zadań, które są uruchamiane, gdy aparat jest wyblakły.
Korzystanie z zadań systemu sceny
W większości przypadków będziesz używać zadań dostarczonych przez usługę 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")
);
}
Korzystanie z zadań niestandardowych
W innych przypadkach możesz wykonać przejście bez faktycznego ładowania sceny:
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
}
Możesz też załadować scenę bez korzystania z usługi 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();
}
}
Korzystanie z wielu zadań
Można również podać wiele zadań, które zostaną wykonane w następującej kolejności:
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;
}
Korzystanie ze wskaźnika postępu
Wskaźnik postępu to wszystko, co implementuje IProgressIndicator
interfejs. Może to mieć postać ekranu powitalnego, wskaźnika ładowania tagalong 3D lub dowolnego innego elementu, które udostępniają opinię na temat postępu przejścia.
Jeśli UseDefaultProgressIndicator
zostanie zaewidencjonowany w profilu SceneTransitionService, po rozpoczęciu przejścia zostanie utworzone wystąpienie wskaźnika postępu. Do czasu trwania przejścia można uzyskać dostęp do właściwości i Message
wskaźników Progress
za pośrednictwem metod i SetProgressMessage
usługSetProgressValue
.
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();
}
}
Alternatywnie podczas wywoływania DoSceneTransition
można podać własny wskaźnik postępu za pośrednictwem opcjonalnego progressIndicator
argumentu. Spowoduje to zastąpienie domyślnego wskaźnika postępu.