Service de transition de scène — MRTK2

Cette extension simplifie l’activité de la décoloration d’une scène, de l’affichage d’un indicateur de progression, du chargement d’une scène, puis de la rétro-suppression.

Les opérations de scène sont pilotées par le service SceneSystem, mais toute opération basée sur des tâches peut être utilisée pour piloter une transition.

Activation de l’extension

Pour activer l’extension, ouvrez votre profil RegisteredServiceProvider. Cliquez sur Inscrire un nouveau fournisseur de services pour ajouter une nouvelle configuration. Dans le champ Type de composant, sélectionnez SceneTransitionService. Dans le champ Profil de configuration, sélectionnez le profil de transition de scène par défaut inclus avec l’extension.

Options de profil

Utiliser l’indicateur de progression par défaut

Si cette option est activée, le préfabriqué de l’indicateur de progression par défaut est utilisé lorsqu’aucun objet indicateur de progression n’est fourni lors de l’appel DoSceneTransition. Si un objet indicateur de progression est fourni, la valeur par défaut est ignorée.

Utiliser la couleur de fondu

Si cette option est cochée, le service de transition applique un fondu pendant votre transition. Ce paramètre peut être modifié au moment de l’exécution via la propriété du UseFadeColor service.

Couleur de fondu

Contrôle la couleur de l’effet de fondu. Alpha est ignoré. Ce paramètre peut être modifié au moment de l’exécution avant une transition via la propriété du FadeColor service.

Fondu des cibles

Contrôle les caméras auxquelles un effet de fondu est appliqué. Ce paramètre peut être modifié au moment de l’exécution via la propriété du FadeTargets service.

Paramètre Caméras ciblées
Principal Applique l’effet de fondu à l’appareil photo main.
Interface utilisateur du service Applique un effet de fondu aux caméras de la couche d’interface utilisateur. (N’affecte pas l’interface utilisateur de superposition)
Tous S’applique aux caméras main et d’interface utilisateur.
Custom S’applique à un ensemble personnalisé de caméras fournies via SetCustomFadeTargetCameras

Temps de fondu/fondu dans le temps

Paramètres par défaut pour la durée d’un fondu à l’entrée/sortie d’une transition. Ces paramètres peuvent être modifiés au moment de l’exécution via les propriétés et FadeInTime du FadeOutTime service.

Type de fader de l’appareil photo

Classe ICameraFader à utiliser pour appliquer un effet de fondu aux caméras. La classe par défaut CameraFaderQuad instancie un quad avec un matériau transparent devant la caméra cible près du plan de clip. Une autre approche peut consister à utiliser un système de post-effets.

En utilisant l’extension

Vous utilisez le service de transition en transmettant les tâches exécutées pendant que la caméra est éteinte.

Utilisation de tâches système de scène

Dans la plupart des cas, vous utiliserez les tâches fournies par le service 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")
        );
}

Utilisation de tâches personnalisées

Dans d’autres cas, vous pouvez effectuer une transition sans charger réellement une scène :

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
}

Vous pouvez également charger une scène sans utiliser le service 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();
    }
}

Utilisation de plusieurs tâches

Vous pouvez également fournir plusieurs tâches, qui seront exécutées dans l’ordre :

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;
}

Utilisation de l’indicateur de progression

Un indicateur de progression est tout ce qui implémente l’interface IProgressIndicator . Cela peut prendre la forme d’un écran de démarrage, d’un indicateur de chargement tagalong 3D ou de tout autre élément qui fournit des commentaires sur la progression de la transition.

Si UseDefaultProgressIndicator est archivé dans le profil SceneTransitionService, un indicateur de progression est instancié au début d’une transition. Pendant la durée de la transition, les propriétés et Message les propriétés de Progress cet indicateur sont accessibles via les méthodes et SetProgressMessage de SetProgressValue ce service.

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();
    }
}

Lors de l’appel DoSceneTransition , vous pouvez également fournir votre propre indicateur de progression via l’argument facultatif progressIndicator . Cela remplacera l’indicateur de progression par défaut.