unity 2D 触摸事件被某物阻塞

unity 2D touch event blocked by something

我的项目设置如下:

主摄像头

Canvas

屏蔽掩码:无

2 个对象设置:

  1. 游戏对象

    • 精灵渲染器

    • 二维刚体

    • 圆形碰撞器 2D

    • (我的 GO 脚本)

  2. 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 个解决方案:

  1. 使用 OnTriggerEnter2D
  2. 拖动 GO 时关闭 Physics2DRaycaster LayerMask GO

1.使用 OnTriggerEnter2D

  1. 拖动GO时。将事件拍摄到 UI 并告诉哪个 GO 正在拖动。
  2. 添加 rigibody2D(isKinematic 和 Freeze xyz)和 2Dcollider(is 触发器)作为 UI 对象中的组件。
  3. OnTriggerEnter2D 收到我的 GO 碰撞器并检查它是否是拖动的 GO。(这样做是因为我非常希望 UI 得到我唯一的拖动 GO)。

2。拖动 GO

时关闭 Physics2DRaycaster LayerMask GO
  1. 使用此代码: 使用 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 = 图层蒙版 |启用图层蒙版; }

  2. 拖动GO时关闭GO layerMask。拖动结束时重新打开。 raycast 可以通过 GO 到 UI 并接收 OnPointerXXX 事件。

我认为 EventSystem 是自动的。选择物理光线投射或图形光线投射来检测 GO/UI 个对象。所以你只能接收其中一组事件(非UI/UI)。这是正确的吗? 似乎我在网上搜索,很多人使用 OnMouseXXX(或其他方法)而不是事件系统(即 OnPointerXXX)。这样他们就可以 "touch through" 转到 UI。