次の方法で共有


シーン遷移サービス — MRTK2

この拡張機能は、シーンのフェードアウト、進行状況インジケーターの表示、シーンの読み込み、フェードインのビジネスを簡略化します。

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

拡張機能の有効化

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

プロファイル オプション

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

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

フェード カラーを使用する

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

フェード カラー

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

ターゲットをフェードする

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

設定 ターゲット カメラ
メイン メインカメラにフェード効果を適用します。
UI UI レイヤー上のカメラにフェード効果を適用します。 (オーバーレイ UI には影響しません)
すべて メインカメラと UI カメラの両方に適用されます。
カスタム によって提供されるカメラのカスタム セットに適用されます。 SetCustomFadeTargetCameras

フェードアウト時間/フェードインタイム

切り替えの開始/終了時のフェードの継続時間の既定の設定。 これらの設定は、サービスの FadeOutTime プロパティと FadeInTime プロパティを使用して実行時に変更できます。

カメラフェーダータイプ

カメラ ICameraFader フェード効果を適用するために使用するクラスです。 既定の CameraFaderQuad クラスでは、クリップ プレーンの近くのターゲット カメラの前に透明なマテリアルを持つクワッドがインスタンス化されます。 もう 1 つの方法は、ポストエフェクトシステムを使用することです。

拡張機能の使用

切り替えサービスを使用するには、カメラのフェードアウト中に実行されるタスクを渡します。

シーン システム タスクの使用

ほとんどの場合、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 プロパティには、そのサービスの SetProgressValueSetProgressMessage メソッドを使用してアクセスできます。

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 引数を使用して独自の進行状況インジケーターを指定することもできます。 これにより、既定の進行状況インジケーターがオーバーライドされます。