1

我有一张卡片,上面有一些图标。该卡上有一个 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);
        }
    }
}

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

更新组件视图如下: 在此处输入图像描述

4

1 回答 1

1

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

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

于 2018-09-27T11:54:25.267 回答