夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLens 2用のSlateでスクロールをlockする HoloLens アドベントカレンダー2020 7日目

本日はMRTKの調査枠です。またHoloLensアドベントカレンダー2020 7日目の記事です。

Slateを改造してscrollを制限できるように設定します。

※この記事ではMRTK v2.51現在最新版を使用しています。 これ以降のバージョンでは解消されている可能性があります

〇Slateとは?

SlateはHoloLens 2の機能でユーザーの手を使用して画面をスクロールすることができます。

f:id:Holomoto-Sumire:20201207095039g:plain

MRTKのExamplesには[SlateExamples]という名のデモシーンが提供されており、Slateの動きと仕組みを見ることができます。

f:id:Holomoto-Sumire:20201207092223j:plain

〇Slateの仕組み

Slateは[BoxCollider(当たり判定)]とユーザのタッチを検知するコンポーネント[NearInteractionTouchable]をアタッチされています。

これに加えて[HandInteractionPanZoom]コンポーネントがアタッチされています。

f:id:Holomoto-Sumire:20201207094729j:plain

この[HandInteractionPanZoom]コンポーネントがスクロールを担う機能を持っています。

f:id:Holomoto-Sumire:20201207094844j:plain

[HandInteractionPanZoom]コンポーネントはパラメータが用意されており、設定を行うことができますが主要なものは次のようになります。

・IsEnabled

スクロールの機能をオンオフする設定です。

f:id:Holomoto-Sumire:20201207095536j:plain ・Enabled Zoom

両手を使用してズーム機能を使用するかどうかを設定します。

f:id:Holomoto-Sumire:20201207095554j:plain

・Lock Horizontal

f:id:Holomoto-Sumire:20201207095622j:plain

このチェックボックスを有効にすることで並行方向のスクロールがロックされます。

・Lock Vertical

f:id:Holomoto-Sumire:20201207095729j:plain

このチェックボックスを有効にすることで鉛直方向のスクロールがロックされます。

Lock HorizontalLock VerticalEnabled Zoom の3種の設定の組み合わせによりスクロールの大まかな機能を決定します。

・Events

PanStartedのイベントはtouchを検知したタイミングで発生するイベントです。

PanStopedのイベントはtouchをリリースしたタイミングで発生するイベントです。

PanUpdateのイベントはスクロールしている間発生するイベントです。

f:id:Holomoto-Sumire:20201207095955j:plain

〇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]のチェックボックスを外します。

f:id:Holomoto-Sumire:20201207111827j:plain

これによってスクロールに制限が加わりました。

f:id:Holomoto-Sumire:20201207112458g:plain

追加したmaxPanVertical_HighとmaxPanVertical_Minの値を変更することで様々なスクロールの範囲に対応できます。

f:id:Holomoto-Sumire:20201207112604j:plain

〇HoloLensアドベントカレンダーとは?

冒頭でもお知らせしましたが、本日の記事はHoloLensアドベントカレンダー7日目の記事になります。

qiita.com

明日は私の師であるガチ本さんのCognitive Services系の記事があります。