统一2D触摸事件被

时间:2016-11-06 11:13:23

标签: events canvas unity3d gameobject

我的项目设置如下:

主摄像头

  • Physics 2D Raycaster
  • 事件掩码:Everthing

帆布

  • Graphic Raycaster
  • 阻止对象:无

阻挡面具:没什么

2个对象设置:

  1. GameObject

    • 精灵渲染器

    • Rigidbody 2D

    • Circle Collider 2D

    • (我的GO脚本)

  2. UI

    • 图像

    • 按钮

    • (我的用户界面脚本)

  3. 在我的GO和UI脚本中,我添加了OnPointerEnter事件。并且两者都可以自行完成。我可以收到OnPointerEnter事件。

    但是当我使用关节拖动GO对象并移动到UI对象的顶部时。我的UI对象OnPointerEnter被GO阻止。我无法收到UI OnPointerEnter事件。

    我在网上搜索,每个人都要求在GO上阻止光线投射到UI。但我需要相反,我希望GO和UI都接收OnPointerEnter事件,无论它们是否重叠。任何提示?

    P.S。在2D版本,GameObject块UI对象中的这样的东西。但我仍然希望收到UI Object OnPointerEnter。

    enter image description here

1 个答案:

答案 0 :(得分:1)

最后得到我想要的东西。现在我有两个解决方案:

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

    <强> 1。使用OnTriggerEnter2D

    1. 拖动GO时。将事件发送到UI并告诉拖动哪个GO。
    2. 添加rigibody2D(isKinematic和Freeze xyz)和2Dcollider(触发器)作为UI对象中的组件。
    3. OnTriggerEnter2D接收我的GO对撞机并检查它是否是拖动GO。(这样做是因为我非常想让UI得到我唯一的拖动GO)。
    4. <强> 2。拖动GO

      时关闭Physics2DRaycaster LayerMask GO
      1. 使用此代码: using 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; }
        public void turnOnLayerMask(string layerMaskName) { Physics2DRaycaster p2drc = Camera.main.GetComponent(); LayerMask layerMask = p2drc.eventMask; LayerMask enableLayerMask = 1 << LayerMask.NameToLayer(layerMaskName); p2drc.eventMask = layerMask | enableLayerMask; }

      2. 拖动GO时关闭GO layerMask。拖动结束时打开。光线投射可以通过GO到UI并接收OnPointerXXX事件。

      3. 我认为EventSystem是自动的。选择EITHER Physical raycast或Graphic raycast来检测GO / UI对象。因此,您只能接收一组事件(非UI / UI)。这是对的吗? 我似乎在网上搜索并且许多人使用OnMouseXXX(或其他方法)而不是Event系统(即OnPointerXXX)。因此,他们可以“触摸”GO到UI。