なが月・35日目

35日目

帰宅後から開始。さらなるuGUIの調査とOculus Integration v1.40(Oculus/VR/Scenes/UI シーン)の検証を経て、以下のことが分かった。

  • OVR RaycasterCanvasに取り付ける。Pointerは画面内に仮想カーソルを出す場合に用いると考えられる。無くてもエラーは吐かない。
  • OVR Input ModuleのCursorにはシーン内のOVR Gaze Pointerを指定しなければならない。指定したGaze PointerからのRaycastがイベントを発生させる。Joypad Click buttonがデスクトップUIにおけるクリック・ドラッグに相当し、デフォルトはAボタン(One)のはずである。Primary Index Triggerが直感的だろう。これは自由にすればよい。Gaze Click Keyはキーボード操作での代替キーである。Perform Sphere Castはサンプルではオンだが恩恵は不明であった。
  • OVR Gaze Pointerは空のGameObjectに取り付ける。スクリプト中でtransform.Find("GazeIcon")を呼んで取得しようとするため、GazeIconという名前の子がないとNullReferenceExceptionになる。HideByDefaultにチェックが入っているとUI要素上にない場合勝手に消えてしまうため、開発中はチェックを外すべきだろう。Depth scale multiplierはレティクルの単なるサイズ倍率である。0.03だと遠めのところにUIがあったときかなり大きくなってしまうので0.02くらいがよいように感じる。Match Normalは斜めからUIなどrayがhitしたときにその平面に吸い付くように表示角度を変化させるか、それとも変化させず常に描画スクリーン(HMDのいずれかのCameraEye)に正対するかを決める。
  • OVR Gaze Pointer, OVR Input ModuleにあるRay Transformはレイキャストの発射点であり、指定のTransformのローカル+Z軸に照射される。
  • よくOVR Gaze Pointerのサンプルを流用して~という話が転がっているが何も解決にならないのでGazeIconの構成についても書くと、Gaze IconはQuad+アルファつきテクスチャ(サンプルではOculus/UnlitTransparent)で視線インジケータとして表示されるようになっている。OVR Overlayスクリプトもアタッチされているが、これは描画優先度を指定するものでフレームレートが落ちた時でも当該オブジェクトの描画は優先されカクつかないようにするためのものだと思われる。設定はサンプルにおいてはOverlay-depth 0-Quad-Use Default Rectsである。なくても問題はない。描画優先度の問題なので。
  • OVR Physics RaycasterがサンプルのCameraRigにはついているが、これは3Dオブジェクトへのレイキャストでイベントを発生させたいときのためであり、uGUI操作だけなら不要である。

結論としてCanvasのGraphicRaycasterをOVRRaycasterに置換(PointerはCanvas内仮想カーソルでoptional)、親を持たない空GameObjectにOVRGazePointerを追加、RayTransformはレイキャスト発射元として望む物を指定、その子にGazeIconの名をつけてQuadメッシュにカーソル画像を設定、EventSystemのStandard Input ModuleをOVRInputModuleに置換、同じRayTransformを設定、Cursorは先の空GameObjectを指定することでuGUIイベントを発生させることができる。