Služba přechodu scény – MRTK2

Toto rozšíření zjednodušuje práci s vybalením scény, zobrazením indikátoru průběhu, načtením scény a následným vybalením.

Operace scény jsou řízeny službou SceneSystem, ale všechny operace založené na úlohách lze použít k řízení přechodu.

Povolení rozšíření

Pokud chcete rozšíření povolit, otevřete profil RegisteredServiceProvider. Kliknutím na Zaregistrovat nového poskytovatele služeb přidejte novou konfiguraci. V poli Typ komponenty vyberte SceneTransitionService. V poli Konfigurační profil vyberte výchozí profil přechodu scény, který je součástí rozšíření.

Možnosti profilu

Použití výchozího ukazatele průběhu

Pokud je tato možnost zaškrtnutá, použije se výchozí prefab indikátoru průběhu, pokud při volání DoSceneTransition. není k dispozici žádný objekt indikátoru průběhu, bude výchozí hodnota ignorována.

Použití barvy prolnutí

Pokud je tato políčko zaškrtnuté, služba přechodu použije během přechodu zeslabí. Toto nastavení je možné změnit za běhu prostřednictvím vlastnosti služby UseFadeColor .

Barva prolnutí

Určuje barvu efektu prolnutí. Alfa je ignorována. Toto nastavení je možné změnit za běhu před přechodem prostřednictvím vlastnosti služby FadeColor .

Cíle prolnutí

Určuje, které kamery budou mít efekt zesvětlovat. Toto nastavení je možné změnit za běhu prostřednictvím vlastnosti služby FadeTargets .

Nastavení Cílené kamery
Hlavní Použije efekt fade u hlavní kamery.
Uživatelské rozhraní Použije efekt fade u fotoaparátů ve vrstvě uživatelského rozhraní. (Nemá vliv na překryvné uživatelské rozhraní)
Vše Platí pro hlavní kamery i kamery uživatelského rozhraní.
Vlastní Platí pro vlastní sadu kamer poskytovaných prostřednictvím SetCustomFadeTargetCameras

Čas slábnutí / slábnutí v čase

Výchozí nastavení pro dobu slábnutí při vstupu nebo ukončení přechodu. Tato nastavení je možné změnit za běhu prostřednictvím vlastností a FadeInTime služebFadeOutTime.

Typ faderu fotoaparátu

Kterou ICameraFader třídu použít pro použití efektu fade u fotoaparátů Výchozí CameraFaderQuad třída vytvoří instanci čtyřúhelníku s průhledným materiálem před cílovou kamerou v blízkosti roviny klipu. Dalším přístupem může být použití systému post effects.

Použití rozšíření

Službu přechodu použijete tak, že předáte úkoly, které se spustí, když je kamera zesláblá.

Použití úkolů systému scény

Ve většině případů budete používat úlohy poskytované službou 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")
        );
}

Použití vlastních úloh

V jiných případech můžete chtít provést přechod bez skutečného načtení scény:

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
}

Nebo můžete chtít načíst scénu bez použití služby 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();
    }
}

Použití více úkolů

Můžete také zadat několik úloh, které se budou spouštět v pořadí:

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

Použití ukazatele průběhu

Indikátorem průběhu je cokoli, co implementuje IProgressIndicator rozhraní. To může mít podobu úvodní obrazovky, indikátoru načítání z 3D značek nebo čehokoli jiného, co poskytuje zpětnou vazbu o průběhu přechodu.

Pokud UseDefaultProgressIndicator je v profilu SceneTransitionService zaškrtnutá, při zahájení přechodu se vytvoří indikátor průběhu. Po dobu trvání přechodu lze k vlastnostem Progress a Message vlastnostem tohoto ukazatele přistupovat prostřednictvím těchto služeb SetProgressValue a SetProgressMessage metod.

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

Případně můžete při volání DoSceneTransition zadat vlastní indikátor průběhu prostřednictvím volitelného progressIndicator argumentu. Tím se přepíše výchozí indikátor průběhu.