Scèneovergangsservice — MRTK2

Deze extensie vereenvoudigt het uitfaden van een scène, het weergeven van een voortgangsindicator, het laden van een scène en het weer vervagen.

Scènebewerkingen worden aangestuurd door de SceneSystem-service, maar elke taakgebaseerde bewerking kan worden gebruikt om een overgang aan te drijven.

De extensie inschakelen

Open het profiel RegisteredServiceProvider om de extensie in te schakelen. Klik op Een nieuwe serviceprovider registreren om een nieuwe configuratie toe te voegen. Selecteer ScèneTransitionService in het veld Type onderdeel. Selecteer in het veld Configuratieprofiel het standaardprofiel voor scèneovergang dat is opgenomen in de extensie.

Profielopties

Standaardvoortgangsindicator gebruiken

Als dit selectievakje is ingeschakeld, wordt de prefab van de standaardvoortgangsindicator gebruikt wanneer er geen voortgangsindicatorobject wordt opgegeven bij het aanroepen DoSceneTransition. Van een voortgangsindicatorobject wordt de standaardwaarde genegeerd.

Kleur vervagen gebruiken

Als deze optie is ingeschakeld, past de overgangsservice een fade toe tijdens de overgang. Deze instelling kan tijdens runtime worden gewijzigd via de eigenschap van UseFadeColor de service.

Kleur vervagen

Hiermee bepaalt u de kleur van het vervagingseffect. Alfa wordt genegeerd. Deze instelling kan worden gewijzigd tijdens runtime voorafgaand aan een overgang via de eigenschap van FadeColor de service.

Doelen vervagen

Hiermee bepaalt u op welke camera's een vervagingseffect wordt toegepast. Deze instelling kan tijdens runtime worden gewijzigd via de eigenschap van FadeTargets de service.

Instelling Gerichte camera's
Belangrijkste Hiermee past u een fade-effect toe op de hoofdcamera.
Gebruikersinterface Hiermee past u een fade-effect toe op camera's op de gebruikersinterfacelaag. (Heeft geen invloed op de overlay-gebruikersinterface)
Alles Is van toepassing op zowel hoofd- als UI-camera's.
Aangepast telefoonnummer Is van toepassing op een aangepaste set camera's die via SetCustomFadeTargetCameras

Fade-out/faden in de tijd

Standaardinstellingen voor de duur van een vervaging bij het invoeren/afsluiten van een overgang. Deze instellingen kunnen tijdens runtime worden gewijzigd via de eigenschappen en FadeInTime van FadeOutTime de service.

Type camerafader

Welke ICameraFader klasse moet worden gebruikt voor het toepassen van een fade-effect op camera's. Met de standaardklasse CameraFaderQuad wordt een quad geïnstitueert met een transparant materiaal voor de doelcamera dicht bij het clipvlak. Een andere benadering is het gebruik van een post-effectensysteem.

De extensie gebruiken

U gebruikt de overgangsservice door taken door te geven die worden uitgevoerd terwijl de camera wordt uitgeschakeld.

Scènesysteemtaken gebruiken

In de meeste gevallen gebruikt u Taken die worden geleverd door de SceneSystem-service:

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

Aangepaste taken gebruiken

In andere gevallen kunt u een overgang uitvoeren zonder een scène daadwerkelijk te laden:

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
}

U kunt ook een scène laden zonder de SceneSystem-service te gebruiken:

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

Meerdere taken gebruiken

U kunt ook meerdere taken opgeven, die in volgorde worden uitgevoerd:

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

De voortgangsindicator gebruiken

Een voortgangsindicator is alles waarmee de IProgressIndicator interface wordt geïmplementeerd. Dit kan de vorm hebben van een welkomstscherm, een 3D tagalong-laadindicator of iets anders dat feedback geeft over de voortgang van de overgang.

Als UseDefaultProgressIndicator is ingeschakeld in het profiel SceneTransitionService, wordt er een voortgangsindicator geïnstantieerd wanneer een overgang begint. Voor de duur van de overgang kunnen de eigenschappen van deze indicator Progress en Message worden geopend via de en methoden van SetProgressMessage die serviceSetProgressValue.

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

Als u belt DoSceneTransition , kunt u ook uw eigen voortgangsindicator opgeven via het optionele progressIndicator argument. Hiermee wordt de standaardvoortgangsindicator overschreven.