在嵌套UI元素上检测IPointerEnterHander

时间:2018-09-27 00:46:59

标签: c# unity3d unity-ui

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

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

如果我从卡中将其删除,则它们会在悬停时触发。但是,在使用卡时,它们不会发射。

这里是一个视觉示例,并且平移和箭头分别对应图标及其在层次结构中的位置:

enter image description here enter image description here

我尝试在Update调用中使用EventSystem,但currentSelectedObject始终是Card(或覆盖它的cards按钮)。

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);
        }
    }
}

我本来希望使用图标来处理这种逻辑,但这暂时是可行的。更好的建议欢迎。

更新组件视图如下: enter image description here

1 个答案:

答案 0 :(得分:0)

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

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