本日はMRDLのSurfacesを勉強していきます。
前回は[HandMenu]を見ていきました。
今回はHandMenu内のボタンを見ていきます。
〇Lightning

Surfacesの[HandMenu]ボタンはMRTKで提供されている[PresableButton]がベースとなっています。
inspectorウィンドウからはMRTKで提供されているコンポーネントに加えSurfaces独自の[ButtonLoadContentScene]と呼ばれるコンポーネントがアタッチされています。

[ButtonLoadContentScene]コンポーネントの冒頭には[#oragma warning disable 0649]というコードがあります。
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
#pragma warning disable 0649 // For serialized fields
using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Extensions.SceneTransitions;
using MRDL;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ButtonLoadContentScene : MonoBehaviour
{
...
}
気になったので調べてみるとこれは[Serialize Field]の属性を使用する際にCS0649のエラーが発生することがあり、これはUnityのバージョンや.Netのバージョンによって発生するようですが、このエラーをdisable(無効化)する処理です。
〇ButtonLoadContentScene
このコンポーネントはMRTKで提供されるシーン移行サービスを用いてシーンをロードします。
MRTKのドキュメントは次のようになります。
「MRが楽しい」のホロモンさんの記事にこれを読み解いたものがあり、非常に参考になります。
private void Update()
{
if (loadOnKeyPress && Input.GetKeyDown(keyCode))
LoadContent();
}
public void LoadContent()
{
if (CoreServices.SceneSystem.SceneOperationInProgress)
return;
ISceneTransitionService transitions = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();
transitions.DoSceneTransition(
() => CoreServices.SceneSystem.LoadContent(contentName, loadSceneMode),
() => SurfacePlacement.Instance.PlaceNewSurface());
}
〇Update関数
private void Update()
{
if (loadOnKeyPress && Input.GetKeyDown(keyCode))
LoadContent();
}
Update関数はデバッグ用に使用されています。 インスペクターウィンドウで設定した[keyCode]のボタンが押された際にSceneLodaが読み込まれシーン遷移します。もしくはインスペクターウィンドウから[loadOnKeyPress]のチェックボックスをオンにすることで子のデバッグが使用可能になります。

〇LoadContent
if (CoreServices.SceneSystem.SceneOperationInProgress)
return;
シーンが現在読み込み中の場合は[CoreServices.SceneSystem.SceneOperationInProgress]がTrueが返されます。
これによってscene読み込み中に重複して処理が行われないようになっています。
ISceneTransitionService transitions = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();
transitions.DoSceneTransition(
() => CoreServices.SceneSystem.LoadContent(contentName, loadSceneMode),
() => SurfacePlacement.Instance.PlaceNewSurface());
MRTKのシーン遷移サービスでシーンを読み込みます。
CoreServices.SceneSystem.LoadContent(contentName, loadSceneMode)
[CoreServices.SceneSystem.LoadContent()]では第一引数として読み込むシーン名、第二引数としてモードが指定されています。
このモードはどのようにシーンをロードするのか(現在のシーンにどのように加算するのか?)を指定しており、[Additive]モードと[Single]の二つがあります。
[Additive]モードの場合シーンを複数読み込むことができます。

デフォルトで[Single]が指定されており、シーンが加算されずに上書きされるようになっています。
SurfacesのHandMenuではボタンを押すことで[LoadContent]が読み込まれ、シーンが読み込まれます。
以上でSurfacesアプリのシーンのロードの仕組みに関して学びました。