Служба смены сцен

Это расширение упрощает развитие сцены, выводит индикатор выполнения, загружает сцену, а затем постепенно проводятся.

Операции с сценами управляются службой Сценесистем, но для управления переходом можно использовать любые операции на основе задач.

Включение расширения

Чтобы включить расширение, откройте профиль Регистередсервицепровидер. Щелкните зарегистрировать новый поставщик услуг, чтобы добавить новую конфигурацию. В поле Тип компонента выберите Сценетранситионсервице. В поле профиль конфигурации выберите профиль перехода по умолчанию для сцен, входящий в состав расширения.

Параметры профиля

Использовать индикатор хода выполнения по умолчанию

Если флажок установлен, по умолчанию используется индикатор хода выполнения по умолчанию prefab, если при вызове объекта индикатора выполнения он будет DoSceneTransition. пропущен.

Использовать цвет затухания

Если этот флажок установлен, служба переходов будет применять эффект исчезания во время перехода. Этот параметр можно изменить во время выполнения через UseFadeColor свойство службы.

Цвет затухания

Управляет цветом эффекта угасания. Альфа игнорируется. Этот параметр можно изменить во время выполнения до перехода через FadeColor свойство службы.

Объекты исчезания

Определяет, к каким камерам будет применен эффект угасания. Этот параметр можно изменить во время выполнения через FadeTargets свойство службы.

Параметр Целевые камеры
Главная ветвь Применяет эффект исчезания к основной камере.
UI Применяет эффект исчезания к камерам на уровне пользовательского интерфейса. (Не влияет на пользовательский интерфейс наложения)
Все Применяется как к основной, так и к камерам пользовательского интерфейса.
Особые настройки Применяется к пользовательскому набору камер, предоставляемых через SetCustomFadeTargetCameras

Исчезание времени и исчезновения по времени

Параметры по умолчанию для длительности перезатухания при входе или выходе из перехода. Эти параметры можно изменить во время выполнения с помощью свойств службы FadeOutTime и FadeInTime .

Тип фадер камеры

ICameraFaderКласс, используемый для применения эффекта угасания к камерам. Класс по умолчанию CameraFaderQuad создает экземпляр «четыре» с прозрачным материалом перед целевой камерой, близкой к плоскости обрезки. Другим подходом может быть использование системы отправки эффектов.

Использование расширения

Служба переходов используется путем передачи задач, выполняемых при прохождении камеры.

Использование системных задач сцены

В большинстве случаев вы будете использовать задачи, предоставляемые службой Сценесистем:

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

Использование пользовательских задач

В других случаях может потребоваться выполнить переход без фактической загрузки сцены:

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
}

Или вы можете загрузить сцену без использования службы Сценесистем:

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

Использование нескольких задач

Можно также указать несколько задач, которые будут выполняться по порядку:

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

Использование индикатора выполнения

Индикатор выполнения — это любой объект, реализующий IProgressIndicator интерфейс. Это может быть экран-заставка, индикатор загрузки объемного тагалонга или любое другое, которое предоставляет отзыв о ходе перехода.

Если UseDefaultProgressIndicator в профиле сценетранситионсервице установлен флажок, то при начале перехода будет создан экземпляр индикатора хода выполнения. На время перехода этот индикатор Progress и Message свойства могут быть доступны через SetProgressValue SetProgressMessage методы и.

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

Кроме того, при вызове DoSceneTransition можно указать собственный индикатор хода выполнения с помощью необязательного progressIndicator аргумента. Это переопределит индикатор хода выполнения по умолчанию.