Serviço de transição de cenários – MRTK2
Esta extensão simplifica o negócio de desvanecer uma cena, apresentar um indicador de progresso, carregar uma cena e voltar a desaparecer.
As operações de cenário são impulsionadas pelo serviço SceneSystem, mas qualquer operação baseada em tarefas pode ser utilizada para conduzir uma transição.
Ativar a extensão
Para ativar a extensão, abra o perfil RegisteredServiceProvider. Clique em Registar um novo Fornecedor de Serviços para adicionar uma nova configuração. No campo Tipo de Componente, selecione CenaTransitionService. No campo Perfil de Configuração, selecione o perfil de transição de cenário predefinido incluído com a extensão.
Opções de perfil
Utilizar indicador de progresso predefinido
Se selecionada, a pré-base do indicador de progresso predefinida será utilizada quando não for fornecido nenhum objeto de indicador de progresso ao chamar DoSceneTransition.
Se for fornecido um objeto de indicador de progresso, a predefinição será ignorada.
Utilizar cor de desvanecimento
Se estiver selecionado, o serviço de transição aplicará um desvanecimento durante a transição. Esta definição pode ser alterada no runtime através da propriedade do UseFadeColor
serviço.
Cor de desvanecimento
Controla a cor do efeito de desvanecimento. Alfa é ignorado. Esta definição pode ser alterada no runtime antes de uma transição através da propriedade do FadeColor
serviço.
Destinos de desvanecimento
Controla quais as câmaras que terão um efeito de desvanecimento aplicado às mesmas. Esta definição pode ser alterada no runtime através da propriedade do FadeTargets
serviço.
Definições | Câmaras De Destino |
---|---|
Principal | Aplica o efeito de desvanecimento à câmara principal. |
IU | Aplica o efeito de desvanecimento às câmaras na camada de IU. (Não afeta a IU de sobreposição) |
Todos | Aplica-se às câmaras principais e de IU. |
Personalizado | Aplica-se a um conjunto personalizado de câmaras fornecido através de SetCustomFadeTargetCameras |
Tempo de desvanecimento/desvanecimento no tempo
Predefinições para a duração de um desvanecimento ao entrar/sair de uma transição. Estas definições podem ser alteradas no runtime através das propriedades e FadeInTime
do FadeOutTime
serviço.
Tipo de desvanecimento da câmara
Que ICameraFader
classe utilizar para aplicar um efeito de desvanecimento às câmaras. A classe predefinida CameraFaderQuad
instancia um quad com um material transparente em frente à câmara de destino perto do plano de recorte. Outra abordagem pode ser utilizar um sistema de efeitos pós-efeitos.
Utilizar a extensão
Pode utilizar o serviço de transição ao transmitir Tarefas que são executadas enquanto a câmara está desvanecida.
Utilizar tarefas do sistema de cenários
Na maioria dos casos, irá utilizar 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")
);
}
Utilizar tarefas personalizadas
Noutros casos, poderá querer efetuar 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
}
Em alternativa, poderá querer carregar uma cena sem utilizar 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();
}
}
Utilizar várias tarefas
Também pode fornecer várias tarefas, que serão executadas por 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;
}
Utilizar o indicador de progresso
Um indicador de progresso é tudo o que implementa a IProgressIndicator
interface. Isto pode assumir a forma de um ecrã inicial, um indicador de carregamento 3D tagalong ou qualquer outra coisa que forneça feedback sobre o progresso da transição.
Se UseDefaultProgressIndicator
for verificado no perfil SceneTransitionService, será instanciado um indicador de progresso quando uma transição começar. Durante a transição, as propriedades e deste indicador Progress
podem ser acedidas através dos métodos e SetProgressMessage
desse SetProgressValue
serviço.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();
}
}
Em alternativa, ao chamar DoSceneTransition
, pode fornecer o seu próprio indicador de progresso através do argumento opcional progressIndicator
. Isto substituirá o indicador de progresso predefinido.