Предотвратить Raycast при нахождении курсора на UI [Решено]

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

Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение EchoIT 23 сен 2015, 12:50

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

Вот в чём суть вопроса. Есть луч вида:
Синтаксис:
Используется csharp
ray=cam.ScreenPointToRay(Input.mousePosition);

И есть новый UI на канвасе вида Screen Space - Overlay. Нужно сделать так, чтобы луч (используется Physics.Raycast) не проходил (читай: не выполняется условие на if (Physics.Raycast<...>)), если курсор находится на любом из элементов UI. Возможно, нужна какая-то проверка или как-то можно сделать через layermask, не вдупляю что-то. @-)

Буду признателен за помощь в разрешении этой задачки.
Последний раз редактировалось EchoIT 24 сен 2015, 10:52, всего редактировалось 1 раз.
Аватара пользователя
EchoIT
UNец
 
Сообщения: 16
Зарегистрирован: 28 май 2014, 16:30
Skype: od-production
  • ICQ

Re: Предотвратить Raycast при нахождении курсора на UI

Сообщение M16 23 сен 2015, 20:47

Наверное можно воспользоваться Physics.RaycastAll, затем перебрать все полученные GameObject-ы и на их основе уже решать - прошел луч или нет. Будет ли UI элемент в этом списке - не знаю.
Синтаксис:
Используется csharp
RaycastHit[] hitsList = Physics.RaycastAll(camRay, camRayLength, mask);
for (int i = 0; i < hitsList.Length; ++i)
{
    GameObject obj = hitsList[i].transform.gameObject;
}
 
M16
UNец
 
Сообщения: 18
Зарегистрирован: 30 апр 2015, 11:01

Re: Предотвратить Raycast при нахождении курсора на UI

Сообщение samana 23 сен 2015, 21:30

Вам нужно, чтобы луч не проходит сквозь UI? Тогда
Синтаксис:
Используется csharp
using UnityEngine.EventSystems;
if (Physics.Raycast(ray))
{
    if (EventSystem.current.IsPointerOverGameObject())
        return;
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Предотвратить Raycast при нахождении курсора на UI

Сообщение EchoIT 24 сен 2015, 10:51

Вам нужно, чтобы луч не проходит сквозь UI? Тогда

Великолепное решение, спасибо! К сожалению, ещё не все тонкости нового UI изучил, а в справке не всегда хорошо ориентируюсь. ;)
Аватара пользователя
EchoIT
UNец
 
Сообщения: 16
Зарегистрирован: 28 май 2014, 16:30
Skype: od-production
  • ICQ

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение samana 24 сен 2015, 11:01

Я бы и сам не догадался, в сети нашел решение.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение TonyMax 04 ноя 2016, 16:17

Вам нужно, чтобы луч не проходит сквозь UI? Тогда

Огромное спасибо, отличное решение
TonyMax
UNец
 
Сообщения: 40
Зарегистрирован: 23 июн 2016, 14:54

Re: Предотвратить Raycast при нахождении курсора на UI

Сообщение z-red 23 янв 2018, 21:34

samana писал(а):Вам нужно, чтобы луч не проходит сквозь UI? Тогда
Синтаксис:
Используется csharp
using UnityEngine.EventSystems;
if (Physics.Raycast(ray))
{
    if (EventSystem.current.IsPointerOverGameObject())
        return;
}


Спасибо, работает. Но обьясните, почему?
https://docs.unity3d.com/ScriptReferenc ... bject.html как то не очень понятно. Как соотносится EventSystem к UI ?
Аватара пользователя
z-red
UNец
 
Сообщения: 30
Зарегистрирован: 02 янв 2018, 18:48
Откуда: Zaporizhzhya

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение samana 23 янв 2018, 21:56

z-red писал(а):Как соотносится EventSystem к UI ?

UI ведь работает за счёт системыСобытий. Вообще это обширная тема, я мало о ней знаю, вот справка на русском https://docs.unity3d.com/ru/current/Man ... ystem.html
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение Baluska 15 июл 2021, 16:31

Почему-то при билде на андроид не работает, а для Пк все норм. Никто не знает как решить?
Baluska
UNец
 
Сообщения: 4
Зарегистрирован: 15 июл 2021, 16:29

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение 1max1 15 июл 2021, 16:39

Baluska писал(а):Почему-то при билде на андроид не работает, а для Пк все норм. Никто не знает как решить?

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

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение Baluska 15 июл 2021, 19:15

1max1 писал(а):
Baluska писал(а):Почему-то при билде на андроид не работает, а для Пк все норм. Никто не знает как решить?

Может ты код покажешь, или нам угадать?

Синтаксис:
Используется csharp
    void Update()
    {
        NavMeshAgent agent = GetComponent<NavMeshAgent>();
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Input.GetMouseButton(0))
        {
            if (Physics.Raycast(ray, out hit))
            {
                if (EventSystem.current.IsPointerOverGameObject())
                {
                    return;
                }
                else if (hit.collider.CompareTag("Plane"))
                {
                    agent.destination = hit.point;
                }
            }
        }
}
 
Последний раз редактировалось Baluska 15 июл 2021, 19:26, всего редактировалось 1 раз.
Baluska
UNец
 
Сообщения: 4
Зарегистрирован: 15 июл 2021, 16:29

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение Baluska 15 июл 2021, 19:24

мне нужно чтоб плейер не двигался когда я нажимаю на ui, на пк всё ок работает, а при билде на телефоне он бежит в место под ui.
Baluska
UNец
 
Сообщения: 4
Зарегистрирован: 15 июл 2021, 16:29

Re: Предотвратить Raycast при нахождении курсора на UI [Решено]

Сообщение Baluska 17 июл 2021, 08:55

Сам решил задачу)
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class InputPlayer : MonoBehaviour
{
    public GraphicRaycaster m_Raycaster; //сюда кидаем canvas, на нем должен висеть компонент GraphicReycaster.
    PointerEventData m_PointerEventData;
    public EventSystem m_EventSystem; //сюда кидаем eventsystem

    void FixedUpdate()
    {
        NavMeshAgent agent = GetComponent<NavMeshAgent>();
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Input.GetMouseButton(0))
        {
            m_PointerEventData = new PointerEventData(m_EventSystem);
            m_PointerEventData.position = Input.mousePosition;
            List<RaycastResult> results = new List<RaycastResult>();
            m_Raycaster.Raycast(m_PointerEventData, results);
            if (results.Count == 0)
            {
                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider.CompareTag("Plane"))
                    {
                        agent.destination = hit.point;
                    }
                }
            }
        }
    }
}
 
Baluska
UNец
 
Сообщения: 4
Зарегистрирован: 15 июл 2021, 16:29


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

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

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