はじめに
こういうのを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
↧