Servizio di transizione della scena - MRTK2
Questa estensione semplifica l'attività di sbiadire una scena, visualizzando un indicatore di stato, caricando una scena, quindi sbiadando.
Le operazioni della scena sono guidate dal servizio SceneSystem, ma qualsiasi operazione basata su attività può essere usata per eseguire una transizione.
Abilitazione dell'estensione
Per abilitare l'estensione, aprire il profilo RegisteredServiceProvider. Fare clic su Registra un nuovo provider di servizi per aggiungere una nuova configurazione. Nel campo Tipo componente selezionare SceneTransitionService. Nel campo Profilo di configurazione selezionare il profilo di transizione della scena predefinito incluso nell'estensione.
Opzioni profilo
Usare l'indicatore di stato predefinito
Se selezionato, il prefab dell'indicatore di stato predefinito verrà usato quando non viene fornito alcun oggetto indicatore di stato quando viene chiamato DoSceneTransition.
Se viene fornito un oggetto indicatore di stato, il valore predefinito verrà ignorato.
Usare il colore di dissolvenza
Se selezionata, il servizio di transizione applicherà una dissolvenza durante la transizione. Questa impostazione può essere modificata in fase di esecuzione tramite la proprietà del UseFadeColor
servizio.
Colore di fade
Controlla il colore dell'effetto di dissolvenza. Alfa viene ignorato. Questa impostazione può essere modificata in fase di esecuzione prima di una transizione tramite la proprietà del FadeColor
servizio.
Destinazioni di fade
Controlla quali telecamere avranno un effetto di dissolvenza applicato a loro. Questa impostazione può essere modificata in fase di esecuzione tramite la proprietà del FadeTargets
servizio.
Impostazione | Telecamere mirate |
---|---|
Principale | Applica l'effetto di dissolvenza alla fotocamera principale. |
Interfaccia utente | Applica l'effetto di dissolvenza alle fotocamere sul livello dell'interfaccia utente. (Non influisce sull'interfaccia utente di sovrapposizione) |
Tutti | Si applica alle fotocamere principali e dell'interfaccia utente. |
Personalizzato | Si applica a un set personalizzato di telecamere fornite tramite SetCustomFadeTargetCameras |
Fade out time/fade in time
Impostazioni predefinite per la durata di una dissolvenza durante l'immissione o l'uscita da una transizione. Queste impostazioni possono essere modificate in fase di FadeOutTime
esecuzione tramite le proprietà e FadeInTime
del servizio.
Tipo di fader della fotocamera
Classe ICameraFader
da usare per applicare un effetto di dissolvenza alle fotocamere. La classe predefinita CameraFaderQuad
crea un'istanza di un quad con un materiale trasparente davanti alla fotocamera di destinazione vicino al piano di clip. Un altro approccio potrebbe essere quello di usare un sistema post effetti.
Uso dell'estensione
Si usa il servizio di transizione passando attività eseguite mentre la fotocamera viene disattivata.
Uso delle attività del sistema della scena
Nella maggior parte dei casi si usano attività fornite dal servizio 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")
);
}
Uso di attività personalizzate
In altri casi è possibile eseguire una transizione senza caricare effettivamente una scena:
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
}
In alternativa, è possibile caricare una scena senza usare il servizio 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();
}
}
Uso di più attività
È anche possibile fornire più attività, che verranno eseguite in ordine:
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;
}
Uso dell'indicatore di stato
Un indicatore di stato è qualsiasi elemento che implementa l'interfaccia IProgressIndicator
. Ciò può assumere la forma di una schermata iniziale, un indicatore di caricamento tagalong 3D o qualsiasi altro elemento che fornisce commenti e suggerimenti sullo stato di avanzamento della transizione.
Se UseDefaultProgressIndicator
viene archiviato nel profilo SceneTransitionService, verrà creata un'istanza di un indicatore di stato quando inizia una transizione. Per la durata della transizione, è possibile accedere alle proprietà e all'indicatore Progress
tramite i metodi e SetProgressMessage
del servizioSetProgressValue
.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();
}
}
In alternativa, quando si chiama DoSceneTransition
è possibile fornire il proprio indicatore di avanzamento tramite l'argomento facoltativo progressIndicator
. Verrà eseguito l'override dell'indicatore di stato predefinito.