シーン遷移サービス — 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
プロパティには、そのサービスの 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
引数を使用して独自の進行状況インジケーターを指定することもできます。 これにより、既定の進行状況インジケーターがオーバーライドされます。