Служба перехода сцены — MRTK2

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

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

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

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

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

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

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

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

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

Исчезание цвета

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

Исчезание целевых объектов

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

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

Время увядает / исчезает во времени

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

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

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

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

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

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

В большинстве случаев вы будете использовать задачи, предоставляемые службой 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")
        );
}

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

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

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
}

Или вы можете загрузить сцену без использования службы 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();
    }
}

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

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

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 интерфейс . Это может быть экран-заставка, трехмерный индикатор загрузки tagalong или любой другой объект, предоставляющий обратную связь о ходе перехода.

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

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 аргумента. Это переопределит индикатор хода выполнения по умолчанию.