【发布时间】: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);
}
}
}
我本来希望图标来处理这个逻辑,但这暂时有效。欢迎提出更好的建议。
【问题讨论】:
-
如果这是一个副本,我将删除。我在提问时没有找到类似的。
-
关于您的文档参考,我相信这只是告诉我它是否超过了 GameObject,而不是它是否超过了特定元素。
-
正如您在问题中看到的那样,我讨论过这实际上是行不通的