Scenövergångstjänst – MRTK2

Det här tillägget förenklar arbetet med att ta bort en scen, visa en förloppsindikator, läsa in en scen och sedan tona in igen.

Scenåtgärder drivs av tjänsten SceneSystem, men alla aktivitetsbaserade åtgärder kan användas för att driva en övergång.

Aktivera tillägget

Om du vill aktivera tillägget öppnar du profilen RegisteredServiceProvider. Klicka på Registrera en ny tjänstleverantör för att lägga till en ny konfiguration. I fältet Komponenttyp väljer du SceneTransitionService. I fältet Konfigurationsprofil väljer du standardprofilen för scenövergång som ingår i tillägget.

Profilalternativ

Använd standardindikator för förlopp

Om den är markerad används standardförloppsindikatorns prefab när inget förloppsindikatorobjekt anges när du anropar DoSceneTransition. Om ett förloppsindikatorobjekt anges ignoreras standardinställningen.

Använd toningsfärg

Om det här alternativet är markerat kommer övergångstjänsten att använda en toning under övergången. Den här inställningen kan ändras vid körning via tjänstens UseFadeColor egenskap.

Tona färg

Styr toningseffektens färg. Alpha ignoreras. Den här inställningen kan ändras vid körning före en övergång via tjänstens FadeColor egenskap.

Tona mål

Kontrollerar vilka kameror som kommer att ha en toningseffekt som tillämpas på dem. Den här inställningen kan ändras vid körning via tjänstens FadeTargets egenskap.

Inställningen Riktade kameror
Main Tillämpar toningseffekt på huvudkameran.
UI Tillämpar toningseffekt på kameror i användargränssnittsskiktet. (Påverkar inte överläggsgränssnittet)
Alla Gäller för både huvudkameror och UI-kameror.
Anpassat Gäller för en anpassad uppsättning kameror som tillhandahålls via SetCustomFadeTargetCameras

Tona ut tid/tona ut i tid

Standardinställningar för varaktigheten för en toning när du anger/avslutar en övergång. De här inställningarna kan ändras vid körning via tjänstens FadeOutTime och FadeInTime egenskaperna.

Kamera fader typ

Vilken klass som ICameraFader ska användas för att tillämpa en toningseffekt på kameror. CameraFaderQuad Standardklassen instansierar en quad med ett transparent material framför målkameran nära klippplanet. En annan metod kan vara att använda ett posteffektsystem.

Använda tillägget

Du använder övergångstjänsten genom att skicka uppgifter som körs medan kameran är urkopplad.

Använda scensystemuppgifter

I de flesta fall använder du uppgifter som tillhandahålls av tjänsten 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")
        );
}

Använda anpassade uppgifter

I andra fall kanske du vill utföra en övergång utan att faktiskt läsa in en scen:

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
}

Eller så kanske du vill läsa in en scen utan att använda tjänsten 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();
    }
}

Använda flera uppgifter

Du kan också ange flera uppgifter som ska köras i ordning:

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

Använda förloppsindikatorn

En förloppsindikator är allt som implementerar IProgressIndicator gränssnittet. Detta kan ha formen av en välkomstskärm, en 3D-tagalong-inläsningsindikator eller något annat som ger feedback om övergångsförloppet.

Om UseDefaultProgressIndicator kontrolleras i profilen SceneTransitionService instansieras en förloppsindikator när en övergång påbörjas. Under övergångens varaktighet kan den här indikatorns Progress och Message egenskaperna nås via tjänstens SetProgressValue och SetProgressMessage metoderna.

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

Du kan också ange en egen förloppsindikator via det valfria progressIndicator argumentet när du anroparDoSceneTransition. Detta åsidosätter standardindikatorn för förlopp.