Přechodová služba scény

Toto rozšíření zjednodušuje podnikání na scéně, zobrazuje indikátor průběhu, načítá scénu a pak pokračuje zpátky.

Operace scény jsou řízeny službou SceneSystem, ale k zajištění přechodu lze použít jakoukoli operaci založenou na úlohách.

Povolení rozšíření

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

Možnosti profilu

Použít výchozí indikátor průběhu

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

Použít barvu slábnutí

Pokud je zaškrtnuto, přechodová služba se během přechodu použije. Toto nastavení lze změnit za běhu prostřednictvím UseFadeColor Vlastnosti služby.

Zeslabit barvy

Určuje barvu efektu slábnutí. Hodnota alfa je ignorována. Toto nastavení lze změnit za běhu před přechodem prostřednictvím FadeColor Vlastnosti služby.

Rozmizet cíle

Řídí, na kterých fotoaparátech se má použít efekt slábnutí. Toto nastavení lze změnit za běhu prostřednictvím FadeTargets Vlastnosti služby.

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

Vymizet čas nebo zeslabení v čase

Výchozí nastavení pro dobu trvání přechodu při vstupu nebo ukončení přechodu. Tato nastavení se dají změnit za běhu prostřednictvím FadeOutTime vlastností služby a FadeInTime .

Typ Fader kamery

Která ICameraFader Třída se má použít pro použití efektu slábnutí na fotoaparáty. Výchozí CameraFaderQuad Třída vytvoří instanci ve čtverčíku s průhledným materiálem před cílovou kamerou blízko k rovině klipu. Dalším přístupem může být použití systému post Effects.

Použití rozšíření

Přechodovou službu použijete tak, že předáte úlohy, které se spustí, když je fotoaparát nezvolna.

Použití systémových úloh 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ůže být vhodné 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 možná budete 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 úloh

Můžete také zadávat více úloh, které se spustí v uvedeném 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í indikátoru průběhu

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

Pokud UseDefaultProgressIndicator je v profilu SceneTransitionService zaškrtnuto, při zahájení přechodu se vytvoří instance indikátoru průběhu. Po dobu trvání přechodu k tomuto ukazateli Progress a k Message vlastnostem může být prostřednictvím této služby a metody k dispozici SetProgressValueSetProgressMessage .

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.