Hololens の InputManager の動きを読んでみた

HoloToolkit.Unity.InputModule.InputManager
Assets/HoloToolkit/Input/Prefabs/InputManagerプレハブから見る。
InputManager
+ (GazeManager)
+ (GazeStablilizer)
+ (InputManager)
+ (StabilizationPlaneModifier)
GesturesInput# BaseInputSource(UnityEngine.VR.WSA.Input.GestureRecognizerを通じてジェスチャーを取得する)
RawInteractionSourcesInput# BaseInputSource(UnityEngine.VR.WSA.Input.InteractionSourceを通じて手の検出・位置・ロストなどのイベントを検知する)
EditorHandsInput# BaseInputSource(Editor向けに手イベントを偽装する)
こんな感じに親子関係があって結構たくさんスクリプトがアタッチされている。
主要な部分だけに減らすと以下の3つのスクリプトになる。
InputManager
+ (GazeManager)
+ (InputManager)
GesturesInput# BaseInputSource(UnityEngine.VR.WSA.Input.GestureRecognizerを通じてジェスチャーを取得する)
この3つのスクリプトは下記のように連携する。
GazeManager -> raycast -> hitObject
|
v
GesturesInput -> event -> InputManager -> hitObjectのeventハンドラを実行する
UnityのEventSystemとの連携
通常のUnityのEventは、EventSystemがアタッチされたInputModule(StandardInputModule)のProcess関数をコールすることで始まる。
HoloToolkitのInputManagerは、GestureRecognizer等からのイベントを即座にUnityのEventに変換して発行していた。
ShouldSendUnityUiEventsでInputManager.csを検索すると以下がヒットする。
HoloToolkit-Unity\Assets\HoloToolkit\Input\Scripts\InputManager.cs(308)
HoloToolkit-Unity\Assets\HoloToolkit\Input\Scripts\InputManager.cs(317)
HoloToolkit-Unity\Assets\HoloToolkit\Input\Scripts\InputManager.cs(340)
HoloToolkit-Unity\Assets\HoloToolkit\Input\Scripts\InputManager.cs(363)
HoloToolkit-Unity\Assets\HoloToolkit\Input\Scripts\InputManager.cs(386)
コードを見てみると
// hololensのevent
ExecuteEvents.ExecuteHierarchy(newObject, null, OnFocusEnterEventHandler);
if (ShouldSendUnityUiEvents)
{
// unity仕様に変換して実行
ExecuteEvents.ExecuteHierarchy(newObject
, GazeManager.Instance.UnityUIPointerEvent, ExecuteEvents.pointerEnterHandler);
}
という風になっていて、以下の5種類のイベント転送を実装していた。
IPointerClickHandler
IPointerDownHandler
IPointerEnterHandler
IPointerExitHandler
IPointerUpHandler
これだとButton等のクリックイベントを処理するタイプのものは動く。
DragとかScrollイベントは別途イベント転送してやる必要がありそう。
なるほど。