Servicio de transición de escena: MRTK2

Esta extensión simplifica el negocio de atenuar una escena, mostrar un indicador de progreso, cargar una escena y luego atenuarse.

Las operaciones de escena están controladas por el servicio SceneSystem, pero cualquier operación basada en tareas se puede usar para impulsar una transición.

Habilitación de la extensión

Para habilitar la extensión, abra el perfil de RegisteredServiceProvider. Haga clic en Registrar un nuevo proveedor de servicios para agregar una nueva configuración. En el campo Tipo de componente, seleccione SceneTransitionService. En el campo Perfil de configuración, seleccione el perfil de transición de escena predeterminado incluido con la extensión.

Opciones de perfil

Usar el indicador de progreso predeterminado

Si se activa, se usará el objeto prefabricado del indicador de progreso predeterminado cuando no se proporcione ningún objeto de indicador de progreso al llamar a DoSceneTransition. Si se proporciona un objeto de indicador de progreso, se omitirá el valor predeterminado.

Usar color de atenuación

Si está activada, el servicio de transición aplicará un fundido durante la transición. Esta configuración se puede cambiar en tiempo de ejecución a través de la propiedad del UseFadeColor servicio.

Color de atenuación

Controla el color del efecto de atenuación. Se omite Alpha. Esta configuración se puede cambiar en tiempo de ejecución antes de una transición a través de la propiedad del FadeColor servicio.

Destinos de atenuación

Controla qué cámaras tendrán un efecto de atenuación aplicado a ellas. Esta configuración se puede cambiar en tiempo de ejecución a través de la propiedad del FadeTargets servicio.

Configuración Cámaras dirigidas
Método Main Aplica efecto de atenuación a la cámara principal.
UI Aplica efecto de atenuación a las cámaras de la capa de interfaz de usuario. (No afecta a la interfaz de usuario de superposición)
Todo Se aplica a las cámaras principales y de interfaz de usuario.
Personalizado Se aplica a un conjunto personalizado de cámaras proporcionadas a través de SetCustomFadeTargetCameras

Tiempo de espera de atenuación/atenuación en el tiempo

Configuración predeterminada durante la duración de un fundido al entrar o salir de una transición. Esta configuración se puede cambiar en tiempo de ejecución a través de las propiedades y FadeInTime del FadeOutTime servicio.

Tipo de fundido de cámara

Clase que ICameraFader se va a usar para aplicar un efecto de atenuación a las cámaras. La clase predeterminada CameraFaderQuad crea una instancia de un quad con un material transparente delante de la cámara de destino cerca del plano de recorte. Otro enfoque podría ser usar un sistema de efectos posteriores.

Uso de la extensión

Para usar el servicio de transición, pase Las tareas que se ejecutan mientras la cámara se desvane.

Uso de tareas del sistema de escena

En la mayoría de los casos, usará tareas proporcionadas por el servicio 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 de tareas personalizadas

En otros casos, puede que desee realizar una transición sin cargar realmente una escena:

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
}

O bien, puede que quiera cargar una escena sin usar el servicio 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 de varias tareas

También puede proporcionar varias tareas, que se ejecutarán en orden:

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 del indicador de progreso

Un indicador de progreso es cualquier cosa que implemente la IProgressIndicator interfaz. Esto puede adoptar la forma de una pantalla de presentación, un indicador de carga de tagalong 3D o cualquier otra cosa que proporcione comentarios sobre el progreso de la transición.

Si UseDefaultProgressIndicator se activa en el perfil SceneTransitionService, se creará una instancia de un indicador de progreso cuando comience una transición. Durante la transición, se puede acceder a las propiedades y Message de este indicador Progress a través de los métodos y SetProgressMessage de SetProgressValue ese servicio.

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, al llamar DoSceneTransition , puede proporcionar su propio indicador de progreso a través del argumento opcional progressIndicator . Esto invalidará el indicador de progreso predeterminado.