※ これは 2016/05/31 Unity HoloLens Technical Preview ver.5.4.0beta14(Windows版) 時点の情報です
最新版では動作が異なる可能性がありますのでご注意ください
前々回 は主に Oculus Rift と GearVR 用だった VR UI サンプルを HoloLens で試してみましたが、どうも未対応みたいでした
そんななか、同じ Windows Development の Microsoft MVP である中村さんに情報をいただきました
@kaorun55 そちらの情報は知らなかったです・・・ありがとうございます
— matatabi-ux (@matatabi_ux) 2016年6月1日
自前で取得するしかなさそうですが、まだまだ手探り中です
さっそく Holograms 101E のチュートリアルを見るとその中でジェスチャ認識のチュートリアル動画が
そもそも対象の選択の時点で、これまでの Unity 公式の VR サンプル資産は関係なしに自前で Raycast 当てて検出してた・・・HoloLens は後発のデバイスなのでしょうがないですね;
というわけでこちらの動画も参考にとりあえず Button 上に視線があたったらマウスオーバー的な変化をする処理を試してみようと思います
Raycast で衝突判定するには対象に Colider が必要・・・まずは Unity Editor 上で
Button に被衝突判定を行うための Box Colider を追加しました(普通の uGUI ではやらないと思う)
緑色の矩形が対象範囲となるので、x、y を見た目の Button の大きさに合うように調整しています
次に Script 側
public class VRUI : MonoBehaviour { /// <summary> /// ボタンのラベルテキスト /// </summary> [SerializeField] private UnityEngine.UI.Text buttonLabel; /// <summary> /// 定期的な処理 /// </summary> public void FixedUpdate() { RaycastHit hit; if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit)) { var target = hit.collider.gameObject.GetComponent<Button>(); if (target != null) { this.OnButtonOver(); } } else { this.OnButtonOut(); } } /// <summary> /// 視線オーバーイベントハンドラ /// </summary> private void OnButtonOver() { this.buttonLabel.text = "Over"; } /// <summary> /// 視線アウトイベントハンドラ /// </summary> private void OnButtonOut() { this.buttonLabel.text = "Button"; } /// <summary> /// 視線クリックイベントハンドラ /// </summary> private void OnButtonClick() { this.buttonLabel.text = "Clicked"; } }
FixedUpdate メソッドを追加して、Physics.Raycast でメインカメラ(着用者の視線と同一)の位置から向いている方向に Raycast を飛ばして最初に衝突するものを取得します
衝突物があったら GameObject をとって GetComponent で Button が取れたら実用的ではないですが視線が Button にあると判定して Over、それ以外は Button にラベルを変更します
なぜかチュートリアル動画では Update メソッドの中で衝突判定していたのですが、物理演算系の判定は FixedUpdate の方が同期しやすいのでこっちにしました
ここまでやったら UWP プロジェクトをエクスポートして お試し HoloLens エミュレーター
おお今度は思い通りにできた・・・うーん;