Zefirot
@Zefirot

Как неедопустить нажатия на спрайт который под кнопкой UI?

У меня что-то типа двигаемой карты, на некоторое точки на карте можно нажимать и появляется диалоговое окно, карта это спрайт со спрайтами, так же есть UI кнопка выхода из карты, все работает за исключением одного но - если так совпадает что спрайт на который можно нажать оказывается под кнопкой выхода то при нажатии на нее срабатывает не выход а нажатие на спрайт...
Подскажите как такого избежать?
(Пытался под кнопку еще панель подлаживать, это не помогает, клики по спрайтам проходят через панель...)
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
@BFGunner
Ну тут только искать ошибку в расположении панели UI как по мне. Было один раз такая ситуация, один в один. Выяснилось, что при определенном растягивании экрана (на другом разрешении) сам текст "расползался" корректно, а вот панель-подложка под текст, которая и обрабатывала нажатие - нет. Получалось, что текст и спрайт кнопки были в одном месте, а активное место для тыкания в другом, точнее перекрывало лишь частично текст. Попробуйте копнуть в этом направлении.
Если при нажатии в одно и тоже место кнопки то происходит срабатыввание, то нет, возможно спрайт неким образом находится впереди кнопки. Как обрабатывается нажатие на спрайт? Он тоже является элементом UI?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Fyntig
Только что столкнулся. Порывшись на просторах интернета нашёл видео на 5 минут с примером (https://www.youtube.com/watch?v=ptmum1FXiLE). Чтоб тем кто следом за мной будет искать не переходить лишний раз по ссылкам и не печатать с видео, оставлю свой вариант тут (немного отличается, но суть та же):
1. Если нет прозрачного для рэйкаста UI добавим в скрипт кликабельных объектов, которые могут оказаться под UI :
using UnityEngine.EventSystems;
...
private bool IsPointinOverUI()
{
return UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject();
}
...
public void OnMouseDown()
{
if (IsPointingOverUI() == false)
{
...
2. Если есть прозрачные для рэйкаста UI добавим на них пустой скрипт MouseUIClickthrough.cs и сделаем так:
private bool IsPointingOverUIIgnors()
{
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;

List raycastResults = new List();
EventSystem.current.RaycastAll(pointerEventData, raycastResults);

return raycastResults.Select(r => r.gameObject.TryGetComponent(out MouseUIClickthrough component) == false).Count() > 1;
}
...
public void OnMouseDown()
{
if (IsPointingOverUIIgnors() == false)
{
...
Больше одного смотрю потому что считает и самого себя
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы