LoginSignup
2
1

More than 1 year has passed since last update.

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

Posted at

はじめに

こういうのをOculus Integrationで作りました。

その際にIPointerEnterHandler実機でのみ反応しなくて困りました。

解決策をメモします。

バージョン情報

諸々名前 バージョン
Unity 20219.4.29f1
Oculus Integration 35.0

原因

OVRInputModuleProcessMouseEventが原因です。

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);

    //...以下省略
}

ProcessMoveHandlePointerExitAndEnterの中でIPointerEnterHandlerが呼び出されています。
ProcessMovePointerInputModuleに実装されています。

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1