【发布时间】:2019-06-14 21:36:30
【问题描述】:
我想用我通过代码在别处手动指定的目标替换统一事件系统的目标。
这是为了允许常规的统一事件为附近的对象适当地触发,即使指针可能不直接在目标上。 (瞄准辅助/指针捕捉/稳定)
我的问题是,即使我用所需的目标更新事件系统的选定游戏对象,统一事件系统也不会触发,因为它仍然认为指针不在目标上方。 (虽然在编辑器事件系统调试对话框中,和高亮效果(针对 UI 元素)相应地触发并显示所选目标已更改。)
//Raycast to snapped object
Physics.Raycast(pos, rot, out hitInfo, 20f);
//Populate pointer event data using current
PointerEventData ped = new PointerEventData(EventSystem.current);
//Update data using snapped objects data
ped.pointerCurrentRaycast = new RaycastResult {
distance = hitInfo.distance,
gameObject = focusedObject,
sortingLayer = hitInfo.transform.gameObject.layer,
worldNormal = hitInfo.normal,
worldPosition = hitInfo.point
};
//Update current target - Target changes in unity debug dialog, but has no effect on clickability
EventSystem.current.SetSelectedGameObject(focusedObject, ped);
我错过了什么?
-- 编辑澄清--
我目前使用光线投射和基于距离的代码将指针捕捉到非 GUI 组件上的目标,从而启用基于目标捕捉指针的选择。一旦非 GUI 目标被“捕捉”,我利用 IPointerEnter/Exit/Down/Up/Click 的 ExecuteEvents.ExecuteHierarchy 来根据需要手动触发事件。
但是,对于 GUI 组件目标,如果我利用相同的自定义事件代码,我将失去与更复杂、动态的 GUI 组件交互的能力,而无需多种变通方法并为每个 GUI 元素添加碰撞器。我想避免重新设计 unity 的输入模块以支持指针捕捉,因为一旦指针进入其边界,默认输入模块在 GUI 组件上的开箱即用效果非常好。
-- 编辑 2--
我应该补充一点,我正在使用 Unity 的 HoloLensInputModule 和 HoloLensInput 来处理 UI 交互,同时使用我自己的光线投射来处理非 UI 组件。
看来我需要用我的捕捉代码扩展 HoloLensInput.cs 的 GetGazeScreenPosition(),以便不再需要关心更新事件系统
-- 大部分已解决--
通过扩展 StandaloneInputModule 和 BaseInput 并在其继承结构中覆盖多个方法,我基本上解决了这个问题。 (它很丑但是很有效,而且运行效率更高,因为我能够丢弃不需要的额外 RaycastAll 调用)
问题的关键在于,不仅要覆盖深埋在继承类中的 RaycastAll 调用,还要覆盖任何请求或操作 eventData 时。大部分更改与 GetMousePointerEventData() 和 ProcessMouseEvent() 以及几乎所有链接在其中的方法调用(包括子递归)有关。
话虽如此,滚动条存在问题,它会在最小滚动和最大滚动之间跳转。问题似乎来自 ProcessDrag()'s ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); 之后滑块内部使用的 pointerEventData.position 值
【问题讨论】:
-
所以你问如何区分你是捕捉到滑块的拇指还是只是拖动区域的一部分?我不认为 Unity 可以为您做太多事情,您必须使用 Graphics Raycasts,如果滑块是最接近的东西,您会查看它的状态并计算您最接近的位置。也许你可以在那个位置执行一个事件。
-
指针视觉更新的捕捉代码正在工作。在指针捕捉到之后,unity 的独立输入模块的光线投射技术上仍然从相机直接指向前方。这会使指针视觉对象和输入模块目标不对齐,直到释放捕捉为止。指针说我在目标上,当我调用 SetSelectedObject 时它会突出显示,但输入模块的 Down/Click/Up 事件会忽略 SetSelectedObject 以支持其内部光线投射结果。我挖掘得越多,看起来好像我将不得不扩展统一类。