本日はMRDLのSurfacesを勉強していきます。
前回まででアプリ起動時に読み込まれる[Startup Scene]を見ています。
今回はこの[Startup Scene]の[HandMenu]オブジェクトを調査していきます。
〇HandMenu
HandMenuはMRTKで提供されているUIシステムの一つです。
手のひらをかざすことで手に沿ってボタンが現れます。
HoloLens のMixedRealityの世界では視野角の問題に加え、ユーザーのいる物理空間の情報によって大きく体験が変わります。
HandMenuはどのような状況であっても使用できる優れたUIです。
SurfacesアプリではHandMenuを使用して各体験を切り替えます。
HandMenuオブジェクトには次のコンポーネントがアタッチされています。
各Jointの検知を行う[Solver Handler]、手に関するBoundsの[Hand Bounds]、手の向きに合わせてオブジェクトの表示、非表示を行う[HandConstraintPalmUp]、ここまではMRTKで提供されているHandMenuと同様ですが、最後に[Surfaces]で提供されている[Contextual Hand Menu]コンポーネントがアタッチされています。
この[Contextual Hand Menu]コンポーネントはHandMenuの表示の際のアニメーションを制御します。
[Animation Target]は階層が一つ下の[Menu]オブジェクトがアタッチされています。これがアニメーションの対象になります。
[OpenCurve],[ClonseCurve]はそれぞれ表示、非表示時のスケール変化のアニメーションを制御します。
どちらもカーブを描くように設定されているため、表示時に拡大率、縮小率がカーブを描くようになっています。
[Disable Distance]は各体験のオブジェクトがあるときに指定した距離内ではHandMenuが非表示になる仕組みです。
デフォルトでは0.25が設定されており、オブジェクトの25cm以内に手があるときはHandMenuが使用できません。
この仕組みによってユーザーの体験を阻害する要素を抑えています。
if (FingerSurface.ActiveSurface != null) { float distToSurface = Vector3.Distance(FingerSurface.ActiveSurface.SurfacePosition, transform.position); if (distToSurface - FingerSurface.ActiveSurface.SurfaceRadius < disableDistance) { contextProhibited = true; } }
処理を見てみると、Surfaces(オブジェクト)と手の距離をdistToSurfacに代入し、disableDistance内にある場合[contextProhibited]がtrueになります。
private void Update() { bool contextProhibited = DoesContextProhibitMenu(); if (contextProhibited) { CloseMenu(); } ... }
これによってUpdate関数内でCloseMenu()が呼ばれメニューが閉じます。
[Menu]オブジェクトには[Grid ObjectCollection]コンポーネントがアタッチされています。
これはアタッチされている子オブジェクトを均一にレイアウトを行うことができるオブジェクトです。
これによって9つのボタンが均一に配置されるようになっています。
次回はボタンを見ていきます。