本日はMRTKの調査枠です。またHoloLensアドベントカレンダー2020 7日目の記事です。
Slateを改造してscrollを制限できるように設定します。
※この記事ではMRTK v2.51現在最新版を使用しています。 これ以降のバージョンでは解消されている可能性があります
〇Slateとは?
SlateはHoloLens 2の機能でユーザーの手を使用して画面をスクロールすることができます。
MRTKのExamplesには[SlateExamples]という名のデモシーンが提供されており、Slateの動きと仕組みを見ることができます。
〇Slateの仕組み
Slateは[BoxCollider(当たり判定)]とユーザのタッチを検知するコンポーネント[NearInteractionTouchable]をアタッチされています。
これに加えて[HandInteractionPanZoom]コンポーネントがアタッチされています。
この[HandInteractionPanZoom]コンポーネントがスクロールを担う機能を持っています。
[HandInteractionPanZoom]コンポーネントはパラメータが用意されており、設定を行うことができますが主要なものは次のようになります。
・IsEnabled
スクロールの機能をオンオフする設定です。
・Enabled Zoom
両手を使用してズーム機能を使用するかどうかを設定します。
・Lock Horizontal
このチェックボックスを有効にすることで並行方向のスクロールがロックされます。
・Lock Vertical
このチェックボックスを有効にすることで鉛直方向のスクロールがロックされます。
Lock HorizontalLock VerticalEnabled Zoom の3種の設定の組み合わせによりスクロールの大まかな機能を決定します。
・Events
PanStartedのイベントはtouchを検知したタイミングで発生するイベントです。
PanStopedのイベントはtouchをリリースしたタイミングで発生するイベントです。
PanUpdateのイベントはスクロールしている間発生するイベントです。
〇Slateの問題
Slateは非常に優れたUIですが、スクロールの範囲のロック(制限)機能がありません。
このためスマートフォンでウェブページを見る時のようにページの最後までスクロールしたらスクロールが止まるのではなく、最上部からループしてしまいます。
この現象を回避するために[HandInteractionPanZoom]コンポーネントに制限を加えてみます。
①HandInteractionPanZoomコンポーネントの69行目、70行目当たりの次の分を書き換えます。
オリジナル
private float maxPanHorizontal = 2; [SerializeField] [Range(1.0f, 20.0f)]//書き換える private float maxPanVertical = 2;//書き換える [SerializeField] [Range(0.1f, 1.0f)]
書き換え後
private float maxPanHorizontal = 2; [SerializeField] [Range(-20.0f, 20.0f)]//追加 private float maxPanVertical_High = 2;//追加 [SerializeField]//追加 [Range(-20.0f, 20.0f)]//追加 private float maxPanVertical_Min = 2;//追加 [SerializeField] [Range(0.1f, 1.0f)]
この変更ではmaxPanVerticalを最大値と最小値に分解しました。
②437行目を次のように書き換えます。
オリジナル
{ xLimited = true; } if (uvTestValue.y > tiling.y * maxPanVertical || uvTestValue.y < -(tiling.y * maxPanVertical))//書き換える { yLimited = true; }
書き換え
{ xLimited = true; } if (uvTestValue.y > tiling.y * maxPanVertical_High || uvTestValue.y < (tiling.y * maxPanVertical_Min))//変更後 { yLimited = true; }
変更点は以上です。
これによって高さによる制限を与えることができました。
Unityのinspectorウィンドウに戻りHandInteractionPanZoomコンポーネントの[Unlimited Pan]のチェックボックスを外します。
これによってスクロールに制限が加わりました。
追加したmaxPanVertical_HighとmaxPanVertical_Minの値を変更することで様々なスクロールの範囲に対応できます。
〇HoloLensアドベントカレンダーとは?
冒頭でもお知らせしましたが、本日の記事はHoloLensアドベントカレンダー7日目の記事になります。
明日は私の師であるガチ本さんのCognitive Services系の記事があります。