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

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

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

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

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

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

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

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

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

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

Цвет исчезания

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

Цели исчезания

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

Параметр Целевые камеры
Главная ветвь Применяет эффект исчезания к основной камере.
Пользовательский интерфейс Применяет эффект исчезания к камерам на уровне пользовательского интерфейса. (Не влияет на пользовательский интерфейс наложения)
Все Применяется как к основным камерам, так и к камерам пользовательского интерфейса.
Особые настройки Применяется к пользовательскому набору камер, предоставляемых через 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 интерфейс. Это может принимать форму экрана-заставки, индикатора загрузки трехмерного тегалаонга или других элементов, которые предоставляют обратную связь о ходе перехода.

Если UseDefaultProgressIndicator флажок установлен в профиле SceneTransitionService, то при запуске перехода создается экземпляр индикатора хода выполнения. На время перехода этот индикатор 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 аргумента. Это переопределит индикатор хода выполнения по умолчанию.