はじめに
Oculus環境でuGUIを操作する方法はありますが、両手で同時に操作するためにはスクリプトの修正が必要でした。今回はその方法を簡単にまとめます。
関連: Oculus QuestでuGUIを操作する - Qiita
環境
- Unity 2019.4.3f1
- Oculus Integration 1.13.x(多分)
- Oculus Utilities Plugin 1.45.0
- Windows 10 Home
少しバージョンが古い点にご注意ください。
手順
Oculusのライセンス的に全文貼るのは微妙そうなので、重要な部分だけ差分を書きます。
OVRInputModule
一方のコントローラーを使う前提の処理になっているので、コントローラー部分を一般化していきます。
27-30行目.cs
// 変更前
[Tooltip("Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig")]
public Transform rayTransform;
// 変更後
[Tooltip("Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig")]
public Transform leftRayTransform, rightRayTransform;
public OVRCursor m_leftCursor, m_rightCursor;
27-30行目.cs
// 変更前
[Tooltip("Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig")]
public Transform rayTransform;
// 変更後
[Tooltip("Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig")]
public Transform leftRayTransform, rightRayTransform;
public OVRCursor m_leftCursor, m_rightCursor;
477行目.cs
// 変更前
ProcessMouseEvent(GetGazePointerData());
// 変更後
ProcessMouseEvent(GetGazePointerData(leftRayTransform, m_leftCursor, OVRInput.Controller.LTouch));
ProcessMouseEvent(GetGazePointerData(rightRayTransform, m_rightCursor, OVRInput.Controller.RTouch));
595行目.cs
// 変更前
virtual protected MouseState GetGazePointerData()
// 変更後
virtual protected MouseState GetGazePointerData(Transform rayTransform, OVRCursor cursor, OVRInput.Controller controller)
OVRInputはキーマッピング方式が複数あるため、同じように使えるために使用中のコントローラーを指定する方式に修正します。
参考: Oculus Questコントローラーが持つ複数のキーマッピングについて - Qiita
857-860行目.cs
// 変更前
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
// 変更後
virtual protected PointerEventData.FramePressState GetGazeButtonState(OVRInput.Controller controller)
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton, controller);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton, controller);
あと数か所コンパイルエラー出ると思うので、いい感じに直してください。
HandedInputSelector.cs
アクティブなコントローラーに置き換える処理が書いてありましたが、全体的に不要なので以下に置き換えてください。
変更後.cs
public class HandedInputSelector : MonoBehaviour
{
OVRCameraRig m_CameraRig;
[SerializeField] OVRInputModule m_InputModule;
void Start()
{
m_CameraRig = FindObjectOfType<OVRCameraRig>();
m_InputModule.leftRayTransform = m_CameraRig.leftHandAnchor;
m_InputModule.rightRayTransform = m_CameraRig.rightHandAnchor;
}
}
Inspectorから設定
カーソルの参照を設定し直す必要があります。表示したい場合は両手分のカーソルを用意して同じように設定してみてください。
最後に
宣伝ですが、 月額制のメンターサービスで初心者向けの開発サポートをしています。分からないことがあれば是非こちらで質問してください!
https://menta.work/plan/1115