Определить IPointerEnterHander на вложенном элементе пользовательского интерфейса - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть карточка с иконками.На карте есть IPointerEnterHandler, она работает нормально и вызывается, когда мышь входит в объект.На карте есть скрытая кнопка, которая покрывает поверхность.

Проблема в том, что существуют некоторые вложенные объекты GameObject, для которых я хочу обнаруживать события IPointerEnterHandler.У меня есть слушатели IPointerEnterHandler на этих объектах, но они не срабатывают.

Если я удаляю их с карты, они будут срабатывать при зависании.Однако, находясь на карте, они не будут срабатывать.

Вот наглядный пример, а также иерархия и стрелки соответствуют значкам и их месту в иерархии:

enter image description here enter image description here

Я пытался использовать EventSystem при вызове обновления, но currentSelectedObject всегда является картой (или, скорее, кнопкой карты, которая ее закрывает).

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

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

Знаете ли вы, как я могу обнаружить события наведения мыши на этих вложенных объектах (над которыми имеется элемент пользовательского интерфейса, который скрывает событие)?Я хотел бы избежать RayCasting, если это возможно.

Temp Решение:

Я прибегал к использованию Raycast в настоящее время.Я помещаю коллайдер на маленькую иконку и проверяю, попал ли он, когда мышь находится над картой:

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 голосов
/ 27 сентября 2018

Создайте скрытую кнопку, которая покрывает поверхность, как дочерний объект actionsTray.Переместите его в начало списка детей в иерархии.Таким образом, вы можете поместить другие элементы над «скрытой кнопкой» и позволить им запускать их метод IPointerEnterHandler.

Редактировать: Вы также можете использовать RectTransformUtility.RectangleContainsScreenPoint(), если не можете изменить порядок объектов.

...