Usługa przejścia sceny — MRTK2

To rozszerzenie upraszcza działalność w celu zanikania sceny, wyświetlania wskaźnika postępu, ładowania sceny, a następnie zanikania z powrotem.

Operacje sceny są sterowane przez usługę SceneSystem, ale każdą operację opartą na zadaniach można użyć do przeniesienia.

Włączanie rozszerzenia

Aby włączyć rozszerzenie, otwórz profil RegisteredServiceProvider. Kliknij pozycję Zarejestruj nowego dostawcę usług, aby dodać nową konfigurację. W polu Typ składnika wybierz pozycję SceneTransitionService. W polu Profil konfiguracji wybierz domyślny profil przejścia sceny dołączony do rozszerzenia.

Opcje profilu

Użyj domyślnego wskaźnika postępu

Jeśli jest zaznaczone, domyślny prefab wskaźnika postępu będzie używany, gdy podczas wywoływania DoSceneTransition. obiektu wskaźnika postępu nie zostanie podany obiekt wskaźnika postępu, wartość domyślna zostanie zignorowana.

Użyj koloru wyblakłego

Jeśli to pole wyboru, usługa przejścia zastosuje zanikanie podczas przejścia. To ustawienie można zmienić w czasie wykonywania za pośrednictwem właściwości usługi UseFadeColor .

Kolor zanikania

Steruje kolorem efektu zanikania. Alfa jest ignorowana. To ustawienie można zmienić w czasie wykonywania przed przejściem za pośrednictwem właściwości usługi FadeColor .

Zanikanie obiektów docelowych

Kontrolki, które kamery będą miały zastosowanie do nich efekt zanikania. To ustawienie można zmienić w czasie wykonywania za pośrednictwem właściwości usługi FadeTargets .

Ustawienie Kamery docelowe
Główne Stosuje efekt zanikania do głównego aparatu.
Interfejs użytkownika Stosuje efekt zanikania do kamer w warstwie interfejsu użytkownika. (Nie ma wpływu na interfejs użytkownika nakładki)
Wszystko Dotyczy zarówno aparatów głównych, jak i aparatów interfejsu użytkownika.
Niestandardowy Dotyczy niestandardowego zestawu kamer udostępnianych za pośrednictwem SetCustomFadeTargetCameras

Zanikanie czasu / zanikanie w czasie

Domyślne ustawienia czasu trwania zanikania podczas wprowadzania/zamykania przejścia. Te ustawienia można zmienić w czasie wykonywania za pośrednictwem właściwości i FadeInTime usługiFadeOutTime.

Typ fadera aparatu

Która ICameraFader klasa ma być używana do stosowania efektu zanikania do kamer. Domyślna CameraFaderQuad klasa tworzy wystąpienie czworokąta z przezroczystym materiałem przed kamerą docelową w pobliżu płaszczyzny klipu. Innym rozwiązaniem może być użycie systemu efektów post.

Korzystanie z rozszerzenia

Usługa przejścia jest używana przez przekazanie zadań, które są uruchamiane, gdy aparat jest wyblakły.

Korzystanie z zadań systemu sceny

W większości przypadków będziesz używać zadań dostarczonych przez usługę 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")
        );
}

Korzystanie z zadań niestandardowych

W innych przypadkach możesz wykonać przejście bez faktycznego ładowania sceny:

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
}

Możesz też załadować scenę bez korzystania z usługi 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();
    }
}

Korzystanie z wielu zadań

Można również podać wiele zadań, które zostaną wykonane w następującej kolejności:

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

Korzystanie ze wskaźnika postępu

Wskaźnik postępu to wszystko, co implementuje IProgressIndicator interfejs. Może to mieć postać ekranu powitalnego, wskaźnika ładowania tagalong 3D lub dowolnego innego elementu, które udostępniają opinię na temat postępu przejścia.

Jeśli UseDefaultProgressIndicator zostanie zaewidencjonowany w profilu SceneTransitionService, po rozpoczęciu przejścia zostanie utworzone wystąpienie wskaźnika postępu. Do czasu trwania przejścia można uzyskać dostęp do właściwości i Message wskaźników Progress za pośrednictwem metod i SetProgressMessage usługSetProgressValue.

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

Alternatywnie podczas wywoływania DoSceneTransition można podać własny wskaźnik postępu za pośrednictwem opcjonalnego progressIndicator argumentu. Spowoduje to zastąpienie domyślnego wskaźnika postępu.