Služba přechodu scény – MRTK2
Toto rozšíření zjednodušuje práci s vybalením scény, zobrazením indikátoru průběhu, načtením scény a následným vybalením.
Operace scény jsou řízeny službou SceneSystem, ale všechny operace založené na úlohách lze použít k řízení přechodu.
Povolení rozšíření
Pokud chcete rozšíření povolit, otevřete profil RegisteredServiceProvider. Kliknutím na Zaregistrovat nového poskytovatele služeb přidejte novou konfiguraci. V poli Typ komponenty vyberte SceneTransitionService. V poli Konfigurační profil vyberte výchozí profil přechodu scény, který je součástí rozšíření.
Možnosti profilu
Použití výchozího ukazatele průběhu
Pokud je tato možnost zaškrtnutá, použije se výchozí prefab indikátoru průběhu, pokud při volání DoSceneTransition.
není k dispozici žádný objekt indikátoru průběhu, bude výchozí hodnota ignorována.
Použití barvy prolnutí
Pokud je tato políčko zaškrtnuté, služba přechodu použije během přechodu zeslabí. Toto nastavení je možné změnit za běhu prostřednictvím vlastnosti služby UseFadeColor
.
Barva prolnutí
Určuje barvu efektu prolnutí. Alfa je ignorována. Toto nastavení je možné změnit za běhu před přechodem prostřednictvím vlastnosti služby FadeColor
.
Cíle prolnutí
Určuje, které kamery budou mít efekt zesvětlovat. Toto nastavení je možné změnit za běhu prostřednictvím vlastnosti služby FadeTargets
.
Nastavení | Cílené kamery |
---|---|
Hlavní | Použije efekt fade u hlavní kamery. |
Uživatelské rozhraní | Použije efekt fade u fotoaparátů ve vrstvě uživatelského rozhraní. (Nemá vliv na překryvné uživatelské rozhraní) |
Vše | Platí pro hlavní kamery i kamery uživatelského rozhraní. |
Vlastní | Platí pro vlastní sadu kamer poskytovaných prostřednictvím SetCustomFadeTargetCameras |
Čas slábnutí / slábnutí v čase
Výchozí nastavení pro dobu slábnutí při vstupu nebo ukončení přechodu. Tato nastavení je možné změnit za běhu prostřednictvím vlastností a FadeInTime
služebFadeOutTime
.
Typ faderu fotoaparátu
Kterou ICameraFader
třídu použít pro použití efektu fade u fotoaparátů Výchozí CameraFaderQuad
třída vytvoří instanci čtyřúhelníku s průhledným materiálem před cílovou kamerou v blízkosti roviny klipu. Dalším přístupem může být použití systému post effects.
Použití rozšíření
Službu přechodu použijete tak, že předáte úkoly, které se spustí, když je kamera zesláblá.
Použití úkolů systému scény
Ve většině případů budete používat úlohy poskytované službou 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")
);
}
Použití vlastních úloh
V jiných případech můžete chtít provést přechod bez skutečného načtení scény:
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
}
Nebo můžete chtít načíst scénu bez použití služby 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();
}
}
Použití více úkolů
Můžete také zadat několik úloh, které se budou spouštět v pořadí:
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;
}
Použití ukazatele průběhu
Indikátorem průběhu je cokoli, co implementuje IProgressIndicator
rozhraní. To může mít podobu úvodní obrazovky, indikátoru načítání z 3D značek nebo čehokoli jiného, co poskytuje zpětnou vazbu o průběhu přechodu.
Pokud UseDefaultProgressIndicator
je v profilu SceneTransitionService zaškrtnutá, při zahájení přechodu se vytvoří indikátor průběhu. Po dobu trvání přechodu lze k vlastnostem Progress
a Message
vlastnostem tohoto ukazatele přistupovat prostřednictvím těchto služeb SetProgressValue
a SetProgressMessage
metod.
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();
}
}
Případně můžete při volání DoSceneTransition
zadat vlastní indikátor průběhu prostřednictvím volitelného progressIndicator
argumentu. Tím se přepíše výchozí indikátor průběhu.