장면 전환 서비스 - MRTK2

이 확장은 장면을 페이드 아웃하고, 진행률 표시기를 표시하고, 장면을 로드한 다음, 다시 페이드 인하는 작업을 간소화합니다.

장면 작업은 SceneSystem 서비스에 의해 구동되지만 모든 작업 기반 작업을 사용하여 전환을 구동할 수 있습니다.

확장 사용

확장을 사용하도록 설정하려면 RegisteredServiceProvider 프로필을 엽니다. 새 서비스 공급자 등록을 클릭하여 새 구성을 추가합니다. 구성 요소 유형 필드에서 SceneTransitionService를 선택합니다. 구성 프로필 필드에서 확장에 포함된 기본 장면 전환 프로필을 선택합니다.

프로필 옵션

기본 진행률 표시기 사용

이 옵션을 선택하면 진행률 표시기 개체가 제공되면 를 호출 DoSceneTransition. 할 때 진행률 표시기 개체가 제공되지 않으면 기본 진행률 표시기 프리팹이 사용됩니다. 기본값은 무시됩니다.

페이드 색 사용

선택한 경우 전환 서비스는 전환 중에 페이드를 적용합니다. 이 설정은 서비스의 UseFadeColor 속성을 통해 런타임에 변경할 수 있습니다.

페이드 색

페이드 효과의 색을 제어합니다. 알파는 무시됩니다. 이 설정은 서비스의 FadeColor 속성을 통해 전환하기 전에 런타임에 변경할 수 있습니다.

대상 페이드

어떤 카메라가 페이드 효과를 적용할지 제어합니다. 이 설정은 서비스의 FadeTargets 속성을 통해 런타임에 변경할 수 있습니다.

설정 대상 카메라
기본 카메라에 페이드 효과를 적용합니다.
UI UI 계층의 카메라에 페이드 효과를 적용합니다. (오버레이 UI에는 영향을 주지 않음)
모두 기본 및 UI 카메라 모두에 적용됩니다.
사용자 지정 를 통해 제공되는 사용자 지정 카메라 세트에 적용됩니다. SetCustomFadeTargetCameras

페이드 아웃 시간/페이드 인 타임

전환을 입력/종료할 때 페이드 기간의 기본 설정입니다. 이러한 설정은 서비스 FadeOutTimeFadeInTime 속성을 통해 런타임에 변경할 수 있습니다.

카메라 페이더 유형

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 모든 항목입니다. 이는 시작 화면, 3D tagalong 로딩 표시기 또는 전환 진행률에 대한 피드백을 제공하는 다른 항목의 형태를 취할 수 있습니다.

UseDefaultProgressIndicator SceneTransitionService 프로필에서 를 선택하면 전환이 시작될 때 진행률 표시기가 인스턴스화됩니다. 전환 기간 동안 이 표시 Progress 기와 속성은 해당 서비스의 SetProgressValueMessageSetProgressMessage 메서드를 통해 액세스할 수 있습니다.

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 인수를 통해 고유한 진행률 표시기를 제공할 수 있습니다. 그러면 기본 진행률 표시기가 재정의됩니다.