夜風のMixedReality

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

MRTK3のサンプルシーンを実行する BoundsControllExamples その①

本日はMRTK3枠です。

今回はBoundsControllExamplesシーンを見ていきます。

〇BoundsControllExamples

BoundsControllExamplesシーンはUIUXにかかわるサンプルシーンです。

Boundsとは領域という意味で、このサンプルシーンではオブジェクトを操作する際の領域を可視化するサンプルです。

xRアプリケーションでは右目、左目の描画の差によってオブジェクトの距離感をユーザーに伝えていますが、ユーザーによってオブジェクトの距離感を見失うことや精密なオブジェクトの位置を認識することが困難な場合があります。

特にオブジェクトの移動に関しては、難しいと感じる人が多いです。

こういった場合にわかりやすい可視化や制限によってオブジェクトの操作性を上げるのがBoundsControllの役割になります。

もう少し具体的に説明するとハンドルと呼ばれる概念をオブジェクトに付与し、ハンドルを操作することでより直感的にオブジェクトを操作できるようにするサンプルシーンになります、

このシーンでは5つのオブジェクトの例があります、

これらはBoundsControllというゲームオブジェクトの子オブジェクトとして配置されています。

〇Flatted Style

Flatted Styleは平面のQuadの例です。 これは例えば説明文や写真など空間中に浮かぶ操作可能な2Dスタイルの実装に最適です。

このサンプルは実行時にクリック(実機の場合はAirTap)を行うことでBoundingBoxが現れ、ハンドルをつかむことで拡大縮小ができます。

親オブジェクトであるFlatPlaneオブジェクトのは次のようなコンポーネントがアタッチされています。

それぞれの説明は次のようになります。

コンポーネント 説明 備考
AudioSource
Object Manipulator オブジェクトの操作を行うコンポーネント
ConstraintManager オブジェクトの移動などで軸制限を行うコンポーネント
BoundsControll
UX Bounding Configurator
MinMaxScaleConstraint BoundsControllのスケールの最大最小値を制限
UGUI Input Adapter Draggable UGUIのイベントをXRInteractionToolkit関連のコンポーネントとつなぐクラス UGUIInputAdapterの拡張クラス

・UGUI Input Adapter Druggable

ここで注目すべきはBoundControllです。

このコンポーネントがBoundsの管理を行っています。

〇ハンドル

クリックした際に表示されるハンドルはBoundsBouncs Cisuals Prefabにアタッチしたプレファブに由来しています。

デフォルトではMRTKで提供されているBoundingBoxWithHandlesプレファブが使用されています。

ハンドルのプレファブ内の角パーツではScale Handle Interactableコンポーネントがアタッチされており、これはスケール調整に使用されるBoundsHandleInteractableクラスを継承したクラスになります。

BoundsHandleInteractableクラスは角以外のハンドルにアタッチされているクラスです。

Advanced Statefullnteractable SettingsHandle Typeを変更することで別のハンドルタイプとしても使用できます。

〇クリックした際に起動する処理

ManipulationHandles Activeチェックボックスを外すとハンドルの表示がなくなり、チェックボックス=Bool値がTrueの場合ハンドルが起動します。

クリックによってこのBool値をTrueに変えているのがToggle Handles On Clickです。

 private void OnHostDeselected(SelectExitEventArgs args)
        {
            if (!hasPassedToggleThreshold && toggleHandlesOnClick)
            {
                HandlesActive = !HandlesActive;
            }
            hasPassedToggleThreshold = false;
            isHostSelected = false;
        }

本日は軽く触っていきました。

次回以降で別の処理や実装についても見ていきます。

〇参考

learn.microsoft.com