Страница 1 из 2

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

СообщениеДобавлено: 12 авг 2018, 10:56
playsetler
Добрый день, уважаемые форумчане!
Буду краток: почему событие OnMouseDown() срабатывает сквозь UI? Скрипт с этим событием весит на террейне и не нужно чтобы оно срабатывало при нажатии на элементы интерфейса. И второй вопрос в догонку к первому: я так понял что рэйкаст бывает до 2d и 3d объектов, а как получить объект в не зависимости от 2d и 3d объекта? шарился в eventsystem, но там свойство EventSystem.current.currentSelectedGameObject возвращает только 2d объекты :-??

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

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

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

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

СообщениеДобавлено: 12 авг 2018, 12:50
Anonymyx
if(!EventSystem.current.IsPointerOverGameObject() && ...)

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

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

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


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


Спасибо)))))

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

СообщениеДобавлено: 12 авг 2018, 20:21
Anonymyx
Потому что, как я уже сказал выше, обычный рейкаст не видит юи

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

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

СообщениеДобавлено: 12 авг 2018, 21:45
1max1
А у меня не видит(
Видит только если есть коллайдер... мы точно об одном и том же рейкасте говорим?

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

СообщениеДобавлено: 12 авг 2018, 21:47
getAlex
Решение скидывали выше через IsPointerOverGameObject()

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

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

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

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

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

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

Забыл добавить, что тут ещё важно: это канвас на оверлее или другом спейсе.

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

СообщениеДобавлено: 18 авг 2018, 16:50
playsetler
Anonymyx писал(а):
Потому что, как я уже сказал выше, обычный рейкаст не видит юи

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


Обычный Physics.Raycast не реагирует на ui. Реагирует на ui только Physics2D.Raycast

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

СообщениеДобавлено: 18 авг 2018, 16:53
playsetler
1max1 писал(а):А у меня не видит(
Видит только если есть коллайдер... мы точно об одном и том же рейкасте говорим?


Raycast бывает 2d и 3d. Насколько я понял единого Raycast нету, который реагирует на 2d (например ui) и на 3d (3d игровые обьекты)

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

СообщениеДобавлено: 18 авг 2018, 17:27
playsetler
Вообщем, друзья, опытным путем выяснил:
1) OnPointer и все от него производные срабатывают только если находятся на UI
2) OnMouse и все от него производные срабатывают только если находятся не на UI т.е. если находятся на 2d или 3d collider
И у OnMouse такая особенность - он срабатывает сквозь UI

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

СообщениеДобавлено: 18 авг 2018, 21:45
seaman
Насколько я понял единого Raycast нету

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

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

СообщениеДобавлено: 19 авг 2018, 02:36
playsetler
seaman писал(а):
Насколько я понял единого Raycast нету

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


Эти методы возвращают только collider2D

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

СообщениеДобавлено: 19 авг 2018, 11:00
seaman
А я что написал?
для 2D рейкаста в 3D окружении

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

СообщениеДобавлено: 19 авг 2018, 11:33
getAlex
Может под 2D райкастом он представляет 3D луч от камеры, перпендикулярно одной из осей, например 0Z? :))

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

СообщениеДобавлено: 19 авг 2018, 17:28
playsetler
seaman писал(а):А я что написал?
для 2D рейкаста в 3D окружении


А Вы читали о чём я писал изначально? Я пишу про единый рэйкаст, который реагирует на 2d и 3d обьекты т.е. стреляешь этим лучем в сцену и он показывает все, что пересек и Ui и 2d и 3d обьекты, а ты сам дальше выбираешь что делать с ними, а так приходится стрелять двумя лучами. Надеюсь Вы меня поняли