我有一张卡片,上面有一些图标。卡上有一个IPointerEnterHandler,它可以正常工作,并在鼠标进入对象时被调用。该卡具有一个覆盖表面的隐藏按钮。
问题是,有一些嵌套的GameObjects我想在其上检测IPointerEnterHandler事件。我在这些对象上有IPointerEnterHandler侦听器,但它们不会触发。
如果我从卡中将其删除,则它们会在悬停时触发。但是,在使用卡时,它们不会发射。
这里是一个视觉示例,并且平移和箭头分别对应图标及其在层次结构中的位置:
我尝试在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);
}
}
}
我本来希望使用图标来处理这种逻辑,但这暂时是可行的。更好的建议欢迎。
答案 0 :(得分:0)
将隐藏表面的隐藏按钮作为actionTray对象的子对象。将其移动到层次结构中的子级列表的顶部。这样,您可以将其他元素放在“隐藏按钮”上方,并允许它们触发其IPointerEnterHandler方法。
编辑:
如果您无法更改对象的顺序,则也可以使用RectTransformUtility.RectangleContainsScreenPoint()
。