Scenövergångstjänst

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

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

Aktivera tillägget

Om du vill aktivera tillägget öppnar du din RegisteredServiceProvider-profil. 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 den standardprofil för scenövergång som ingår i tillägget.

Profilalternativ

Använd standard förloppsindikatorn

Om det här alternativet är DoSceneTransition. markerat används standardförloppsindikatorn när inget förloppsindikator-objekt anges när ett förloppsindikatorsobjekt anropas. Om ett förloppsindikator-objekt anges ignoreras standardvärdet.

Använda tona färg

Om det här alternativet är markerat använder övergångstjänsten 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. Alfa ignoreras. Den här inställningen kan ändras vid körning före en övergång via tjänstens FadeColor -egenskap.

Tona mål

Styr vilka kameror som ska ha en toningseffekt tillämpad på dem. Den här inställningen kan ändras vid körning via tjänstens FadeTargets -egenskap.

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

Tona ut tid/tona ned i tid

Standardinställningar för varaktigheten för en toning när en övergång ska skrivas in/avslutas. De här inställningarna kan ändras vid körning via tjänstens - och FadeOutTime - FadeInTime egenskaper.

Kamerakameratyp

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

Använda tillägget

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

Använda scensystemuppgifter

I de flesta fall kommer du att använda uppgifter som tillhandahålls av SceneSystem-tjänsten:

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 SceneSystem-tjänsten:

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 ske i form av en välkomstskärm, en 3D-taggalong-inläsningsindikator eller något annat som ger feedback om övergångsförloppet.

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

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 DoSceneTransition förloppsindikator via det valfria argumentet när du anropar progressIndicator . Detta åsidosätter standardförloppets indikator.