Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

【Unity(C#)】Oculus Integration使用時、IPointerEnterHandlerが実機で反応しない問題の解決方法

$
0
0
はじめに こういうのをOculus Integrationで作りました。 選択項目に吸いつくポインターの検証🙆‍♂️ pic.twitter.com/uGVOJgQzhf— KENTO⚽️XRエンジニア😎Shader100記事マラソン挑戦中49/100 (@okprogramming) December 27, 2021 その際にIPointerEnterHandlerが実機でのみ反応しなくて困りました。 解決策をメモします。 バージョン情報 諸々名前 バージョン Unity 20219.4.29f1 Oculus Integration 35.0 原因 OVRInputModuleのProcessMouseEventが原因です。 OVRInputModule private void ProcessMouseEvent(MouseState mouseData) { var pressed = mouseData.AnyPressesThisFrame(); var released = mouseData.AnyReleasesThisFrame(); var leftButtonData = mouseData.GetButtonState(PointerEventData.InputButton.Left).eventData; if (!UseMouse(pressed, released, leftButtonData.buttonData)) return; // Process the first mouse button fully ProcessMousePress(leftButtonData); ProcessMove(leftButtonData.buttonData); //ここ ProcessDrag(leftButtonData.buttonData); //...以下省略 } ProcessMoveのHandlePointerExitAndEnterの中でIPointerEnterHandlerが呼び出されています。 ProcessMoveはPointerInputModuleに実装されています。 PointerInputModule protected virtual void ProcessMove(PointerEventData pointerEvent) { var targetGO = (Cursor.lockState == CursorLockMode.Locked ? null : pointerEvent.pointerCurrentRaycast.gameObject); HandlePointerExitAndEnter(pointerEvent, targetGO); } このコード内のCursor.lockStateが実機では常にLockedを返します。 これが原因です。 対応方法 いろいろとやり方はありそうですが、私はProcessMoveと同様の処理をOVRInputModuleに定義し、 ProcessMouseEventで呼び出しました。 OVRInputModuleに新たに定義 private void OriginalProcessMove(MouseButtonEventData data) { var pointerEvent = data.buttonData; var targetGO = pointerEvent.pointerCurrentRaycast.gameObject; HandlePointerExitAndEnter(pointerEvent, targetGO); } OVRInputModuleのProcessMouseEventで呼び出し private void ProcessMouseEvent(MouseState mouseData) { var pressed = mouseData.AnyPressesThisFrame(); var released = mouseData.AnyReleasesThisFrame(); var leftButtonData = mouseData.GetButtonState(PointerEventData.InputButton.Left).eventData; if (!UseMouse(pressed, released, leftButtonData.buttonData)) return; // Process the first mouse button fully ProcessMousePress(leftButtonData); OriginalProcessMove(leftButtonData); //ここを修正 ProcessDrag(leftButtonData.buttonData); //...以下省略 } おわりに Oculusのフォーラムに同じ内容の質問がいくつかあったのでこの記事のリンクを紹介しておきます。 Oculus Quest, UI and Unity : No hover event, even on the example scene Detecting laser pointer hovering on button (Oculus Quest - Unity3D) Unity 2020 or 2021 - Gaze Pointer - Button Hover not working

Viewing all articles
Browse latest Browse all 9749

Trending Articles