シーン切り替えサービス

この拡張機能により、シーンをフェードアウトしたり、進行状況インジケーターを表示したり、シーンを読み込んだり、再生したりできます。

シーン操作は SceneSystem サービスによって駆動されますが、タスクベースの操作を使用して遷移を実行できます。

拡張機能を有効にする

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

プロファイルオプション

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

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

フェード色を使用する

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

フェード色

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

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

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

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

時間/フェードアウト時間をフェードアウトする

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

カメラの fader の種類

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 タグ、または移行の進行状況に関するフィードバックを提供するその他の任意の形式を取ることができます。

UseDefaultProgressIndicatorSceneTransitionService プロファイルでがオンになっている場合は、遷移の開始時に進行状況インジケーターがインスタンス化されます。 遷移の期間中、このインジケーター 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 ます。 これにより、既定の進行状況インジケーターが上書きされます。