【问题标题】:Detect IPointerEnterHander On Nested UI Element在嵌套的 UI 元素上检测 IPointerEnterHander
【发布时间】:2018-10-07 06:36:38
【问题描述】:

我有一张卡片,上面有一些图标。该卡上有一个 IPointerEnterHandler ,它工作正常,当鼠标进入对象时被调用。卡片有一个隐藏在表面的按钮。

问题是,有一些嵌套的游戏对象我想检测 IPointerEnterHandler 事件。我在这些对象上有 IPointerEnterHandler 侦听器,但它们不会触发。

如果我将它们从卡片中移除,它们会在悬停时发射。但是,在卡上时,它们不会开火。

这是一个视觉示例,层次结构和箭头对应于图标及其在层次结构中的位置:

我尝试在 Update 调用中使用 EventSystem,但 currentSelectedObject 始终是卡片(或者更确切地说是覆盖它的卡片按钮)。

private void Update()
{
    Debug.Log(EventSystem.current.currentSelectedGameObject);

    if (EventSystem.current.currentSelectedGameObject == gameObject)
    {
        Debug.Log(1);
    }
}

您知道如何检测这些嵌套对象上的鼠标悬停事件(它们上方有一个占用事件的 UI 元素)吗?如果可能,我想避免使用 RayCasting。

临时解决方案:

我暂时使用了光线投射。我在小图标上放了一个对撞机,然后在鼠标悬停在卡片上时检查它是否命中:

private void Update()
{
    if (!_mouseIsOver)
    {
        HideActionOrPerk();
        return;
    }

    // If it's already showing a card then dont bother checking to show again
    if (_shownCardClone != null) return;

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit[] hits = Physics.RaycastAll(ray, 100.0f);
    Debug.Log(hits);
    foreach(RaycastHit hit in hits)
    {
        S_ActionOrPerkIcon icon = hit.transform.GetComponent<S_ActionOrPerkIcon>();
        if (icon != null)
        {
            ShowActionOrPerk(icon.tooltipCardGO);
        }
    }
}

我本来希望图标来处理这个逻辑,但这暂时有效。欢迎提出更好的建议。

更新组件视图如下:

【问题讨论】:

标签: c# unity3d unity-ui


【解决方案1】:

将覆盖表面的隐藏按钮设置为 actionsTray 对象的子对象。将其移动到层次结构中子列表的顶部。这样,您可以将其他元素放在“隐藏按钮”上方,并允许它们触发 IPointerEnterHandler 方法。

编辑: 如果您无法更改对象的顺序,也可以使用RectTransformUtility.RectangleContainsScreenPoint()

【讨论】:

  • 我不能这样做是有原因的。还有其他卡片交互要求按钮始终位于最上方
  • 好的,我不知道你的代码是如何工作的,也许还有其他方法。使用 sprite.rect.Contains(pointer.pos) 怎么样?
  • 有趣的让我试试
  • 我把它放在更新功能中,但开箱即用它不起作用。将调查
  • 改为使用 RectTransformUtility.RectangleContainsScreenPoint()
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
相关资源
最近更新 更多