在 Oculus GO 触摸板上滑动会触发 UI 次不该点击的点击
Swipe on Oculus GO Touchpad triggers UI clicks when it shouldn't
使用:
统一 2018.4.1 LTS &
Oculus GO
我正在使用注视点与 Unity 交互 UI。
这应该在您扣动扳机时发生,这正是我在脚本中定义的方式:在 go-controller 的触摸板上向左或向右滑动,但也会触发点击。我自己没有定义它,这只是发生的事情,我不知道如何解决它。
我发现并摆弄了 this thread and this thread 中提出的解决方案。
但是,none 这些解决方案为我提供了一种方法来摆脱这些滑动点击,同时保持索引触发点击。
我的输入管理器(与 UI 的索引触发器交互似乎发生在 OVRInputModule 中):
private void Update()
{
if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad) || OVRInput.GetDown(OVRInput.Button.Two))
{
ToggleVidInterface();
}
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
{
StartCoroutine(TouchpadCounter());
}
}
IEnumerator TouchpadCounter()
{
int secondsForCounting = 2;
float startTime = Time.time;
int touchCount = 0;
while (Time.time - startTime <= secondsForCounting && OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger))
{
if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad))
{
touchCount++;
Debug.Log("touchCount for Admin Menue: " + touchCount);
}
if (touchCount >= 3)
{
ActivateAdminMenue();
}
yield return null;
}
yield return null;
}
部分OVRInputModule(不知道对不对):
/// <summary>
/// Get state of button corresponding to gaze pointer
/// </summary>
/// <returns></returns>
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
#if UNITY_ANDROID && !UNITY_EDITOR
// On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
// on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
pressed |= Input.GetMouseButtonDown(0);
released |= Input.GetMouseButtonUp(0);
#endif
if (pressed && released)
return PointerEventData.FramePressState.PressedAndReleased;
if (pressed)
return PointerEventData.FramePressState.Pressed;
if (released)
return PointerEventData.FramePressState.Released;
return PointerEventData.FramePressState.NotChanged;
}
与 Android if 条件混淆只是启用或禁用整体点击(触发器和触摸板)。我在这里错过了什么?如何区分触发点击和触摸板滑动?!
我也 运行 遇到了这个问题,我通过注释掉 OVRInputModule.GetGazeButtonState() 的一部分解决了这个问题:
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
// Comment out or remove this block, because it causes touchpad touch events to register as click events.
// #if UNITY_ANDROID && !UNITY_EDITOR
// // On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
// // on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
// pressed |= Input.GetMouseButtonDown(0);
// released |= Input.GetMouseButtonUp(0);
// #endif
if (pressed && released)
return PointerEventData.FramePressState.PressedAndReleased;
if (pressed)
return PointerEventData.FramePressState.Pressed;
if (released)
return PointerEventData.FramePressState.Released;
return PointerEventData.FramePressState.NotChanged;
}
刚刚发现:
katbot 的答案是将触发点击与触摸板滑动点击分开的两个部分之一。
先在OVRInputModule.cs
中注释掉,像这样:
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
// Comment out or remove this block, because it causes touchpad touch events to register as click events.
// #if UNITY_ANDROID && !UNITY_EDITOR
// On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
// on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
//pressed |= Input.GetMouseButtonDown(0);
//released |= Input.GetMouseButtonUp(0);
// #endif
if (pressed && released)
return PointerEventData.FramePressState.PressedAndReleased;
if (pressed)
return PointerEventData.FramePressState.Pressed;
if (released)
return PointerEventData.FramePressState.Released;
return PointerEventData.FramePressState.NotChanged;
}
然后转到 UnityEditor 中的 OVRInputModule
。在“Joy Pad Click Button”下,现在选择“Primary Index Trigger”。现在你已经通过注释掉 Input.GetMouseButtonDown(0)
东西来杀死触摸板滑动点击,这也会杀死正常的触发器点击。但是我们可以通过将它们链接到 Unity 编辑器中的 "Joy Pad Click Button" 来恢复它们。
使用: 统一 2018.4.1 LTS & Oculus GO
我正在使用注视点与 Unity 交互 UI。
这应该在您扣动扳机时发生,这正是我在脚本中定义的方式:在 go-controller 的触摸板上向左或向右滑动,但也会触发点击。我自己没有定义它,这只是发生的事情,我不知道如何解决它。
我发现并摆弄了 this thread and this thread 中提出的解决方案。
但是,none 这些解决方案为我提供了一种方法来摆脱这些滑动点击,同时保持索引触发点击。
我的输入管理器(与 UI 的索引触发器交互似乎发生在 OVRInputModule 中):
private void Update()
{
if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad) || OVRInput.GetDown(OVRInput.Button.Two))
{
ToggleVidInterface();
}
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
{
StartCoroutine(TouchpadCounter());
}
}
IEnumerator TouchpadCounter()
{
int secondsForCounting = 2;
float startTime = Time.time;
int touchCount = 0;
while (Time.time - startTime <= secondsForCounting && OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger))
{
if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad))
{
touchCount++;
Debug.Log("touchCount for Admin Menue: " + touchCount);
}
if (touchCount >= 3)
{
ActivateAdminMenue();
}
yield return null;
}
yield return null;
}
部分OVRInputModule(不知道对不对):
/// <summary>
/// Get state of button corresponding to gaze pointer
/// </summary>
/// <returns></returns>
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
#if UNITY_ANDROID && !UNITY_EDITOR
// On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
// on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
pressed |= Input.GetMouseButtonDown(0);
released |= Input.GetMouseButtonUp(0);
#endif
if (pressed && released)
return PointerEventData.FramePressState.PressedAndReleased;
if (pressed)
return PointerEventData.FramePressState.Pressed;
if (released)
return PointerEventData.FramePressState.Released;
return PointerEventData.FramePressState.NotChanged;
}
与 Android if 条件混淆只是启用或禁用整体点击(触发器和触摸板)。我在这里错过了什么?如何区分触发点击和触摸板滑动?!
我也 运行 遇到了这个问题,我通过注释掉 OVRInputModule.GetGazeButtonState() 的一部分解决了这个问题:
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
// Comment out or remove this block, because it causes touchpad touch events to register as click events.
// #if UNITY_ANDROID && !UNITY_EDITOR
// // On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
// // on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
// pressed |= Input.GetMouseButtonDown(0);
// released |= Input.GetMouseButtonUp(0);
// #endif
if (pressed && released)
return PointerEventData.FramePressState.PressedAndReleased;
if (pressed)
return PointerEventData.FramePressState.Pressed;
if (released)
return PointerEventData.FramePressState.Released;
return PointerEventData.FramePressState.NotChanged;
}
刚刚发现:
katbot 的答案是将触发点击与触摸板滑动点击分开的两个部分之一。
先在OVRInputModule.cs
中注释掉,像这样:
virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);
// Comment out or remove this block, because it causes touchpad touch events to register as click events.
// #if UNITY_ANDROID && !UNITY_EDITOR
// On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
// on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
//pressed |= Input.GetMouseButtonDown(0);
//released |= Input.GetMouseButtonUp(0);
// #endif
if (pressed && released)
return PointerEventData.FramePressState.PressedAndReleased;
if (pressed)
return PointerEventData.FramePressState.Pressed;
if (released)
return PointerEventData.FramePressState.Released;
return PointerEventData.FramePressState.NotChanged;
}
然后转到 UnityEditor 中的 OVRInputModule
。在“Joy Pad Click Button”下,现在选择“Primary Index Trigger”。现在你已经通过注释掉 Input.GetMouseButtonDown(0)
东西来杀死触摸板滑动点击,这也会杀死正常的触发器点击。但是我们可以通过将它们链接到 Unity 编辑器中的 "Joy Pad Click Button" 来恢复它们。