unity 2D 触摸事件被某物阻塞
unity 2D touch event blocked by something
我的项目设置如下:
主摄像头
- 物理 2D Raycaster
- 事件掩码:Everthing
Canvas
- 图形光线投射器
- 阻止对象:None
屏蔽掩码:无
2 个对象设置:
游戏对象
精灵渲染器
二维刚体
圆形碰撞器 2D
(我的 GO 脚本)
UI
图片
按钮
(我的 UI 脚本)
在我的 GO 和 UI 脚本中,我添加了 OnPointerEnter 事件。两者都可以自己正常工作。我可以接收 OnPointerEnter 事件。
但是当我使用一个关节拖动一个GO对象并移动到UI对象的顶部时。我的 UI 对象 OnPointerEnter 被 GO 阻止了。我无法收到 UI OnPointerEnter 事件。
我在网上搜索,每个人都要求在 GO 上屏蔽光线投射到 UI。但我需要反过来,我希望 GO 和 UI 都收到 OnPointerEnter 事件,无论它们是否重叠。有什么提示吗?
P.S。在 2D 版本中是这样的,GameObject 块 UI 对象。但我仍然想接收 UI 对象 OnPointerEnter。
终于如愿以偿了。现在我有 2 个解决方案:
- 使用 OnTriggerEnter2D
- 拖动 GO 时关闭 Physics2DRaycaster LayerMask GO
1.使用 OnTriggerEnter2D
- 拖动GO时。将事件拍摄到 UI 并告诉哪个 GO 正在拖动。
- 添加 rigibody2D(isKinematic 和 Freeze xyz)和 2Dcollider(is 触发器)作为 UI 对象中的组件。
- OnTriggerEnter2D 收到我的 GO 碰撞器并检查它是否是拖动的 GO。(这样做是因为我非常希望 UI 得到我唯一的拖动 GO)。
2。拖动 GO
时关闭 Physics2DRaycaster LayerMask GO
使用此代码:
使用 UnityEngine.EventSystems;
public void turnOffLayerMask(string layerMaskName)
{
Physics2DRaycaster p2drc = Camera.main.GetComponent();
LayerMask layerMask = p2drc.eventMask;
LayerMask disableLayerMask = 1 << LayerMask.NameToLayer(layerMaskName);
p2drc.eventMask = layerMask & ~disableLayerMask;
}<br>
public void turnOnLayerMask(string layerMaskName)
{
Physics2DRaycaster p2drc = Camera.main.GetComponent();
LayerMask layerMask = p2drc.eventMask;
LayerMask enableLayerMask = 1 << LayerMask.NameToLayer(layerMaskName);
p2drc.eventMask = 图层蒙版 |启用图层蒙版;
}
拖动GO时关闭GO layerMask。拖动结束时重新打开。 raycast 可以通过 GO 到 UI 并接收 OnPointerXXX 事件。
我认为 EventSystem 是自动的。选择物理光线投射或图形光线投射来检测 GO/UI 个对象。所以你只能接收其中一组事件(非UI/UI)。这是正确的吗?
似乎我在网上搜索,很多人使用 OnMouseXXX(或其他方法)而不是事件系统(即 OnPointerXXX)。这样他们就可以 "touch through" 转到 UI。
我的项目设置如下:
主摄像头
- 物理 2D Raycaster
- 事件掩码:Everthing
Canvas
- 图形光线投射器
- 阻止对象:None
屏蔽掩码:无
2 个对象设置:
游戏对象
精灵渲染器
二维刚体
圆形碰撞器 2D
(我的 GO 脚本)
UI
图片
按钮
(我的 UI 脚本)
在我的 GO 和 UI 脚本中,我添加了 OnPointerEnter 事件。两者都可以自己正常工作。我可以接收 OnPointerEnter 事件。
但是当我使用一个关节拖动一个GO对象并移动到UI对象的顶部时。我的 UI 对象 OnPointerEnter 被 GO 阻止了。我无法收到 UI OnPointerEnter 事件。
我在网上搜索,每个人都要求在 GO 上屏蔽光线投射到 UI。但我需要反过来,我希望 GO 和 UI 都收到 OnPointerEnter 事件,无论它们是否重叠。有什么提示吗?
P.S。在 2D 版本中是这样的,GameObject 块 UI 对象。但我仍然想接收 UI 对象 OnPointerEnter。
终于如愿以偿了。现在我有 2 个解决方案:
- 使用 OnTriggerEnter2D
- 拖动 GO 时关闭 Physics2DRaycaster LayerMask GO
1.使用 OnTriggerEnter2D
- 拖动GO时。将事件拍摄到 UI 并告诉哪个 GO 正在拖动。
- 添加 rigibody2D(isKinematic 和 Freeze xyz)和 2Dcollider(is 触发器)作为 UI 对象中的组件。
- OnTriggerEnter2D 收到我的 GO 碰撞器并检查它是否是拖动的 GO。(这样做是因为我非常希望 UI 得到我唯一的拖动 GO)。
2。拖动 GO
时关闭 Physics2DRaycaster LayerMask GO使用此代码:
使用 UnityEngine.EventSystems; public void turnOffLayerMask(string layerMaskName) { Physics2DRaycaster p2drc = Camera.main.GetComponent(); LayerMask layerMask = p2drc.eventMask; LayerMask disableLayerMask = 1 << LayerMask.NameToLayer(layerMaskName); p2drc.eventMask = layerMask & ~disableLayerMask; }<br> public void turnOnLayerMask(string layerMaskName) { Physics2DRaycaster p2drc = Camera.main.GetComponent(); LayerMask layerMask = p2drc.eventMask; LayerMask enableLayerMask = 1 << LayerMask.NameToLayer(layerMaskName); p2drc.eventMask = 图层蒙版 |启用图层蒙版; }
拖动GO时关闭GO layerMask。拖动结束时重新打开。 raycast 可以通过 GO 到 UI 并接收 OnPointerXXX 事件。
我认为 EventSystem 是自动的。选择物理光线投射或图形光线投射来检测 GO/UI 个对象。所以你只能接收其中一组事件(非UI/UI)。这是正确的吗? 似乎我在网上搜索,很多人使用 OnMouseXXX(或其他方法)而不是事件系统(即 OnPointerXXX)。这样他们就可以 "touch through" 转到 UI。