「Unity + Oculus Rift – Gaze Pointer は首が疲れる。 –」で、HMDに紐付いてるGazePointerをTouchに紐付ければLaser Pointerによる対象の選択と遜色ないとわかって実装した。
でまた気づいたのは、んじゃあそのTouchからGazePointerまで線を引けば、あたかもLaserでポイントする先にポインターがある例の奴と同じことじゃんってこと。
基本的にこのサイト
http://rikoubou.hatenablog.com/entry/2018/06/04/193607
の「4:Oculus Goコントローラーからレーザーポインターを出す」を参考にさせていただいた。
上で提供されているLaserPointer.csをProjectに保存しようとするとOculus Integrationの中にも同名のスクリプトがあると叱られたのでLaserPointerNew.csという名前にして作った。
Unityやり始めのころさんざん悩んだなあ、下のように名前はそろえないといけないらしい。
あと、参考にさせていただいたサイトはOculus Goを対象にしているのでOVRInput.Controller.RTrackedRemote、OVRInput.Controller.LTrackedRemoteとなっている。
Touchではこの部分をOVRInput.Controller.RTouch、OVRInput.Controller.LTouchに書き換える。
https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/#touch-input-mapping
ただ、私の場合は右のTouch限定にしたので以下のようにした。
残る課題は2つ。
1.対象を指示していないときでもLaserが出たまま。
2.Pointerをもう少し小さく。
1. OVRGazePointer.cs内にGaze Pointerを描いたり消したりする部分がある。
そこにLaserPointerのActiveのtrue、falseも追加する。
まず先頭に以下を追加する。
これはLaserPointerというGameObjectを探し出して
laserlineという変数に記憶させておくためのコードだ。
元からあるHide()とShow()に以下を追加する。
記憶させておいたGameObjectをActiveにしたりActiveでなくしたりする。
ちなみに、GameObject.Findはその度にやると重くなるから
最初に1回だけやるようにするのがいいらしい。
2. これは簡単。
GazePointer>GazeIconのTransformでScaleが3.548645だったのを
すべて1にした。
追記(2020/01/11)
新たな課題、というか不明点
右のTouchのABにある機能R、左のTouchのXYに別のある機能Lを割り当てたとする。
右のTouchを手から離して置くと、左のTouchのXYが機能LでなくABに割り当てたはずの機能Rを持つ。
当座機能Rが不要で持ってても仕方ないから右のTouchを置いたんだけど…。