Serviço de transição de cena — MRTK2
Essa extensão simplifica o negócio de desvanecer uma cena, exibir um indicador de progresso, carregar uma cena e, em seguida, desaparecer novamente.
As operações de cena são controladas pelo serviço SceneSystem, mas qualquer operação baseada em tarefa pode ser usada para conduzir uma transição.
Habilitando a extensão
Para habilitar a extensão, abra o perfil RegisteredServiceProvider. Clique em Registrar um novo Provedor de Serviços para adicionar uma nova configuração. No campo Tipo de Componente, selecione SceneTransitionService. No campo Perfil de Configuração, selecione o perfil de transição de cena padrão incluído com a extensão .
Opções de perfil
Usar o indicador de progresso padrão
Se for verificado, o prefab do indicador de progresso padrão será usado quando nenhum objeto de indicador de progresso for fornecido ao chamar DoSceneTransition.
Se um objeto de indicador de progresso for fornecido, o padrão será ignorado.
Usar cor de fade
Se marcado, o serviço de transição aplicará um fade durante a transição. Essa configuração pode ser alterada em runtime por meio da propriedade do UseFadeColor
serviço.
Cor de esmaecimento
Controla a cor do efeito fade. Alfa é ignorado. Essa configuração pode ser alterada em runtime antes de uma transição por meio da propriedade do FadeColor
serviço.
Esmaecer destinos
Controla quais câmeras terão um efeito fade aplicado a elas. Essa configuração pode ser alterada em runtime por meio da propriedade do FadeTargets
serviço.
Configuração | Câmeras de destino |
---|---|
Principal | Aplica o efeito fade à câmera main. |
Interface do usuário | Aplica o efeito fade às câmeras na camada de interface do usuário. (Não afeta a interface do usuário de sobreposição) |
Tudo | Aplica-se a main e câmeras de interface do usuário. |
Personalizado | Aplica-se a um conjunto personalizado de câmeras fornecido por meio de SetCustomFadeTargetCameras |
Esmaecer o tempo/esmaecer no tempo
Configurações padrão para a duração de um fade ao entrar/sair de uma transição. Essas configurações podem ser alteradas em runtime por meio das propriedades e FadeInTime
do FadeOutTime
serviço.
Tipo de fader de câmera
Qual ICameraFader
classe usar para aplicar um efeito fade às câmeras. A classe padrão CameraFaderQuad
cria uma instância de um quadriciclo com um material transparente na frente da câmera de destino perto do plano de clipe. Outra abordagem pode ser usar um sistema pós-efeitos.
Usar a extensão
Você usa o serviço de transição passando Tarefas executadas enquanto a câmera está desbotada.
Usando tarefas do sistema de cena
Na maioria dos casos, você usará tarefas fornecidas pelo serviço 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")
);
}
Usando tarefas personalizadas
Em outros casos, talvez você queira executar uma transição sem realmente carregar uma cena:
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
}
Ou talvez você queira carregar uma cena sem usar o serviço 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();
}
}
Usando várias tarefas
Você também pode fornecer várias tarefas, que serão executadas na ordem:
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;
}
Usando o indicador de progresso
Um indicador de progresso é qualquer coisa que implemente a IProgressIndicator
interface. Isso pode assumir a forma de uma tela inicial, um indicador de carregamento 3D tagalong ou qualquer outra coisa que forneça comentários sobre o progresso da transição.
Se UseDefaultProgressIndicator
for verificado no perfil SceneTransitionService, um indicador de progresso será instanciado quando uma transição for iniciada. Durante a transição, as propriedades e desse indicador Progress
podem ser acessadas por meio dos métodos e SetProgressMessage
desse SetProgressValue
Message
serviço.
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();
}
}
Como alternativa, ao chamar DoSceneTransition
, você pode fornecer seu próprio indicador de progresso por meio do argumento opcional progressIndicator
. Isso substituirá o indicador de progresso padrão.