夜風のMixedReality

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

PressableButtonExample ~MixedRealityToolkitExamplesを触ってみる~ その②PressableRoundButton

本日はMRTKのExamples枠です。

MRTKでは機能のサンプルとしてExamplesのシーンでデモとして公開しています。

前回からPressableButtonExamplesシーンを読み解いています。

前回はUnityのプリミティブ3Dオブジェクト(Unity内で作成できる3Dモデル)のCubeを用いてゼロからボタンを作成する過程をみました。

今回はCustom Button Examplesを読み解きます。

〇Custom Button Examples

●PressableRoundButton

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

丸型のボタンで[PressableRoundButton]という名前でPrefabが存在します。

PressableRoundButtonは大きく2種類のパーツで構成されており、[ButtonContent]がボタン本体、[SeeItSayItLabel]がボタンの下部にあるラベルを構成します。

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

[ButtonContent]はさらに[Tube]、[FontPlate]、[TextMeshPro]、[CylinderContainer]がありますが、[FontPlate]、[TextMeshPro]はディアクティブで使用されておらず、実質ボタンの土台のオブジェクトの[Tube]とボタン本体の[CylinderContainer]で構成されています。

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

CylinderContainerは位置情報だけもつ空のオブジェクトで子オブジェクトのCylinderがボタンです。

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

このCylinderにはMRTKStandardShaderのマテリアルがアタッチされており、HoverLightによってカーソルが当たると光が付くようになっています。

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

様々なパーツで構成されているPressableRoundButtonですが、ボタンとしての機能はすべての親オブジェクトのPressableRoundButtonにまとめられています。

●PressableRoundButtonの構成

PressableRoundButtonは[BoxCollider]、[PressableButton]、[PhysicalPressEventRouter]、[Interactable]、[AudioSource]、[NearInteractionTouchable]で構成されています。

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

[PressableButton]はHoloLens2でのHandTrackingを用いたユーザーの手でボタンを押すことができるようにするコンポーネントです。

画像左側が[PressableButton]コンポーネントをオフにしたものです。 ボタンを指で押しても右に比べ反応しなくなっています。

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

[Interactable]コンポーネントはユーザーのアクションに対してリアクションを返すコンポーネントです。

Interactableコンポーネントの[Profiles]ではオブジェクトの持つ状態ごとに様々なアクションを返す[Theme]とそのターゲットを指定できます。

ここでは[SeeItSayItLabel]と[Cylinder]がターゲットとして指定されており、それぞれのThemeが指定されています。

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

SeeItSayItLabelには[HolographicButtonSeeItSayItLabel]という名前のThemeで状態によって[Scale]が変化するThemeが使用されています。

[Forcus]の状態ではScaleがx,y,zそれぞれ1、それ以外の状態では0が指定されており、ボタンにForcusがあっている状態のみSeeItSayItLabelが現れてそれ以外では見えなくなる設定がされています。

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

f:id:Holomoto-Sumire:20200624101824j:plain
Forcusが当たっている状態ではScaleは1

f:id:Holomoto-Sumire:20200624101935j:plain
forcusが当たっていない状態ではScaleは0

同様に[Cylinder]にもThemeが設定されておりこちらは状態によって色とOffset(位置)が変わるようになっています。

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

Pressed(押された)状態でOffsetのzが0.24変位することでボタンが押されるアニメーションが行われます。

このThemeによってユーザーがより押したことを知覚しやすいデザインが実現されています。

[PhysicalPressEventRouter][NearInteractionTouchable]は遠距離からのAirTap操作でのボタンを押すことと、近距離からのHandTrackingでのtouch動作を紐づけてどちらも使用できるようにしています。

以上がPressableRoundButtonの中身です。

ボタンを押した後のイベントはInteractableコンポーネントのEvents,OnClick()内で指定することで実装できます。

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