MRが楽しい

MRやVRについて学習したことを書き残す

hololensで画面UIで操作を行う

前回記事の続きとなります。追加した表示UIのボタンにイベントの設定を行います。
・hololensで画面UIを表示する
 http://bluebirdofoz.hatenablog.com/entry/2017/04/28/021154

やはりUIの表示だけでなく、ボタン操作のINPUTの仕組みも確認しておきたいということです。
まずUnityのButtonオブジェクトに関する勉強になります。以下の記事を参考にしました。
・【uGUI】Buttonの使い方
 http://qiita.com/2dgames_jp/items/b3d7d204895d67742d0c

丁寧な記事です。Buttonオブジェクトに関する様々な情報があります。
折角なので色変更などの設定も行ってみます。
Navigationの設定についてはhololensで使う場合「none」でいいでしょう。
f:id:bluebirdofoz:20170429030510j:plain

ついでにテキストも変更します。
f:id:bluebirdofoz:20170429030515j:plain

最後にイベントの設定です。
ユニティちゃんオブジェクトを指定して現在、ゲーム開始時に呼ばれているOnSelect関数を設定します。
f:id:bluebirdofoz:20170429030521j:plain

アプリをビルドして試してみます。
f:id:bluebirdofoz:20170429030526j:plain
ボタンに視点を合わせてエアタップ動作を行うと…。
f:id:bluebirdofoz:20170429030535j:plain
ボタンが赤に変わり、ゲームが開始しました。成功です。


随分とあっさりと成功してしまいました。
しかし、この裏にはUnityのEventSystemの自動設定とhololens Input Moduleの設定がありました。
仕組みが分からないままでは意味がないので少し調べてみます。
f:id:bluebirdofoz:20170429031538j:plain


そもそもCanvasオブジェクトを作成した際に自動生成されたEventSystemオブジェクトとは何なのでしょう。
・UnityのEventSystemを操る
 http://chungames.hateblo.jp/entry/2015/11/21/234241
・Unity 4.6 から利用できる UI での EventSystem をカスタムする方法について調べてみた
 http://tips.hecomi.com/entry/2014/09/25/233823
・イベントシステム
 https://docs.unity3d.com/jp/540/Manual/EventSystem.html

順に読めば何となく理解できるかも?
EventSystemオブジェクトは Unity 4.6 から導入されたシステムで uGUI を利用する際は必ず追加されるオブジェクトです。
EventSystemにデフォルトで導入されたscriptはそれぞれ下記の役割を持ちます。

  • Event System:どの Input Module が現在有効なのか、どのゲームオブジェクトが現在選択されているかを管理する。

 ・Event System マネージャー
  https://docs.unity3d.com/ja/540/Manual/script-EventSystem.html

  • Standalone Input Module:コントローラー/マウスの入力を管理する

 ・Standalone Input Module
  https://docs.unity3d.com/ja/540/Manual/script-StandaloneInputModule.html

これらのEventSystemとCanvasオブジェクトがどういった関係で結ばれているかというとRaycasterと呼ばれる仕組みです。
例えばCanvasオブジェクトを生成すると、必ずGraphic Raycasterコンポーネントが追加されています。
f:id:bluebirdofoz:20170429030734j:plain

EventSystemは検知した操作についてRaycastという通知を行います。
そしてCanvasオブジェクトはこのRaycasterを通じてそのRaycast通知を受け取ります。
これによって、GUIにコライダ(アタリ判定)を付けなくてもマウス操作などが可能になる訳です。なーる。

前回、EventSystemにHoloLens Input Moduleを追加したのは視線操作とエアタップ操作によるRaycast通知を追加した訳ですね。
表示UIとそれに対する操作はここで閉じている訳です。賢い。
MVP設計に落とし込む際にはGUI操作関連の処理は一纏めにViewと考えた方が良いのかな。