OnMouseDown() срабатывает сквозь UI [решено]

Программирование на Юнити.

OnMouseDown() срабатывает сквозь UI [решено]

Сообщение playsetler 12 авг 2018, 10:56

Добрый день, уважаемые форумчане!
Буду краток: почему событие OnMouseDown() срабатывает сквозь UI? Скрипт с этим событием весит на террейне и не нужно чтобы оно срабатывало при нажатии на элементы интерфейса. И второй вопрос в догонку к первому: я так понял что рэйкаст бывает до 2d и 3d объектов, а как получить объект в не зависимости от 2d и 3d объекта? шарился в eventsystem, но там свойство EventSystem.current.currentSelectedGameObject возвращает только 2d объекты :-??
Последний раз редактировалось playsetler 18 авг 2018, 17:29, всего редактировалось 1 раз.
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

Re: OnMouseDown() срабатывает сквозь UI

Сообщение 1max1 12 авг 2018, 11:28

Обычный рейкаст не реагирует на юи, для юи есть https://docs.unity3d.com/ScriptReferenc ... ycast.html
Буду краток: почему событие OnMouseDown() срабатывает сквозь UI?

Потому что, как я уже сказал выше, обычный рейкаст не видит юи и пролетает мимо, выход - написать скрипт, который будет проверять находится ли курсор на юи и блокировать рейкаст.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: OnMouseDown() срабатывает сквозь UI

Сообщение Anonymyx 12 авг 2018, 12:50

if(!EventSystem.current.IsPointerOverGameObject() && ...)
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: OnMouseDown() срабатывает сквозь UI

Сообщение playsetler 12 авг 2018, 16:53

1max1 писал(а):Обычный рейкаст не реагирует на юи, для юи есть https://docs.unity3d.com/ScriptReferenc ... ycast.html
Буду краток: почему событие OnMouseDown() срабатывает сквозь UI?

Потому что, как я уже сказал выше, обычный рейкаст не видит юи и пролетает мимо, выход - написать скрипт, который будет проверять находится ли курсор на юи и блокировать рейкаст.


Anonymyx писал(а):if(!EventSystem.current.IsPointerOverGameObject() && ...)


Спасибо)))))
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

Re: OnMouseDown() срабатывает сквозь UI

Сообщение Anonymyx 12 авг 2018, 20:21

Потому что, как я уже сказал выше, обычный рейкаст не видит юи

С чего вы это взяли? Галочка Raycast target по умолчанию стоит у UI и обычный рейкаст видит элемент. Вопрос в том почему он идет дальше UI элемента.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: OnMouseDown() срабатывает сквозь UI

Сообщение 1max1 12 авг 2018, 21:45

А у меня не видит(
Видит только если есть коллайдер... мы точно об одном и том же рейкасте говорим?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: OnMouseDown() срабатывает сквозь UI

Сообщение getAlex 12 авг 2018, 21:47

Решение скидывали выше через IsPointerOverGameObject()

А вообще, на сколько я помню, сработает И UI-кнопка И 3д объект под ней.

В описании же
https://docs.unity3d.com/ScriptReferenc ... eDown.html

говорится про GUI, но там вроде бы говорят про старый GUI, а не новый UI. Но это не имеет отношения к делу.

Новый UI сам отловит луч с кликом. Но это будет другой луч (обычный Ray)

OnMouseDown() вроде бы ловит физический райкаст. Т.е. мышка "простреливает" сразу двумя лучами: обычный Ray задевает интерфейс, а физический луч - 3д обьект с коллайдером.

Если в интерфейсе будут коллайдеры и если не будет ограничения в леер маске и ограничения в физике на игнор райкаста, то физический луч не пробьёт интерфейс. Но так делать не нужно. IsPointerOverGameObject() оптимально.

Забыл добавить, что тут ещё важно: это канвас на оверлее или другом спейсе.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: OnMouseDown() срабатывает сквозь UI

Сообщение playsetler 18 авг 2018, 16:50

Anonymyx писал(а):
Потому что, как я уже сказал выше, обычный рейкаст не видит юи

С чего вы это взяли? Галочка Raycast target по умолчанию стоит у UI и обычный рейкаст видит элемент. Вопрос в том почему он идет дальше UI элемента.


Обычный Physics.Raycast не реагирует на ui. Реагирует на ui только Physics2D.Raycast
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

Re: OnMouseDown() срабатывает сквозь UI

Сообщение playsetler 18 авг 2018, 16:53

1max1 писал(а):А у меня не видит(
Видит только если есть коллайдер... мы точно об одном и том же рейкасте говорим?


Raycast бывает 2d и 3d. Насколько я понял единого Raycast нету, который реагирует на 2d (например ui) и на 3d (3d игровые обьекты)
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

Re: OnMouseDown() срабатывает сквозь UI

Сообщение playsetler 18 авг 2018, 17:27

Вообщем, друзья, опытным путем выяснил:
1) OnPointer и все от него производные срабатывают только если находятся на UI
2) OnMouse и все от него производные срабатывают только если находятся не на UI т.е. если находятся на 2d или 3d collider
И у OnMouse такая особенность - он срабатывает сквозь UI
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

Re: OnMouseDown() срабатывает сквозь UI [решено]

Сообщение seaman 18 авг 2018, 21:45

Насколько я понял единого Raycast нету

В 2D рейкасте есть три вспомогательных метода для 2D рейкаста в 3D окружении
GetRayIntersection
GetRayIntersectionAll
GetRayIntersectionNonAlloc
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: OnMouseDown() срабатывает сквозь UI [решено]

Сообщение playsetler 19 авг 2018, 02:36

seaman писал(а):
Насколько я понял единого Raycast нету

В 2D рейкасте есть три вспомогательных метода для 2D рейкаста в 3D окружении
GetRayIntersection
GetRayIntersectionAll
GetRayIntersectionNonAlloc


Эти методы возвращают только collider2D
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

Re: OnMouseDown() срабатывает сквозь UI [решено]

Сообщение seaman 19 авг 2018, 11:00

А я что написал?
для 2D рейкаста в 3D окружении
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: OnMouseDown() срабатывает сквозь UI [решено]

Сообщение getAlex 19 авг 2018, 11:33

Может под 2D райкастом он представляет 3D луч от камеры, перпендикулярно одной из осей, например 0Z? :))
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: OnMouseDown() срабатывает сквозь UI [решено]

Сообщение playsetler 19 авг 2018, 17:28

seaman писал(а):А я что написал?
для 2D рейкаста в 3D окружении


А Вы читали о чём я писал изначально? Я пишу про единый рэйкаст, который реагирует на 2d и 3d обьекты т.е. стреляешь этим лучем в сцену и он показывает все, что пересек и Ui и 2d и 3d обьекты, а ты сам дальше выбираешь что делать с ними, а так приходится стрелять двумя лучами. Надеюсь Вы меня поняли
playsetler
UNец
 
Сообщения: 22
Зарегистрирован: 18 авг 2015, 19:54

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9