はじめに
こういうのを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
が原因です。
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
に実装されています。
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
で呼び出しました。
private void OriginalProcessMove(MouseButtonEventData data)
{
var pointerEvent = data.buttonData;
var targetGO = pointerEvent.pointerCurrentRaycast.gameObject;
HandlePointerExitAndEnter(pointerEvent, targetGO);
}
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