シーン切り替えサービス — MRTK2

この拡張機能により、シーンのフェードアウト、進行状況インジケーターの表示、シーンの読み込み、フェードバックなどの操作が容易になります。

シーン操作は SceneSystem サービスによって行われますが、タスクベースの操作を使用して切り替えを実行することもできます。

拡張機能の有効化

拡張機能を有効にするには、RegisteredServiceProvider プロファイルを開きます。 [Register a new Service Provider] (新しいサービス プロバイダーの登録) をクリックして、新しい構成を追加します。 [Component Type] (コンポーネントの種類) フィールドで、[SceneTransitionService] を選択します。 [Configuration Profile] (構成プロファイル) フィールドで、拡張機能に含まれる既定のシーン切り替えプロファイルを選択します。

プロファイルのオプション

既定の進行状況インジケーターを使用する

このチェック ボックスをオンにすると、進行状況インジケーター オブジェクトが指定されていない場合は、DoSceneTransition. を呼び出したときに、既定の進行状況インジケーター プレハブが使用されます。進行状況インジケーター オブジェクトが指定されている場合は、既定値は無視されます。

フェード色を使用する

オンにした場合、切り替えサービスによって切り替え中にフェードが適用されます。 この設定は、実行時に、サービスの UseFadeColor プロパティを使用して変更できます。

フェード色

フェード効果の色を制御します。 アルファは無視されます。 この設定は、実行時に、サービスの FadeColor プロパティを使用して切り替えの前に変更できます。

フェードの対象

どのカメラにフェード効果を適用するかを制御します。 この設定は、実行時に、サービスの FadeTargets プロパティを使用して変更できます。

設定 対象となるカメラ
メイン メイン カメラにフェード効果を適用します。
UI UI レイヤーのカメラにフェード効果を適用します (オーバーレイ UI には影響しません)。
すべて メイン カメラと UI カメラの両方に適用します。
Custom 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 インターフェイスを実装するものすべてを指します。 これは、スプラッシュ スクリーン、3D Tagalong 読み込みインジケーター、または切り替えの進行状況に関するフィードバックを提供するその他の任意の形を取ることができます。

SceneTransitionService プロファイルで 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 引数を使用して独自の進行状況インジケーターを指定することもできます。 これにより、既定の進行状況インジケーターが上書きされます。