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

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

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

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

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

Буду признателен за помощь в разрешении этой задачки.

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

СообщениеДобавлено: 23 сен 2015, 20:47
M16
Наверное можно воспользоваться 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;
}
 

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

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

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

СообщениеДобавлено: 24 сен 2015, 10:51
EchoIT
Вам нужно, чтобы луч не проходит сквозь UI? Тогда

Великолепное решение, спасибо! К сожалению, ещё не все тонкости нового UI изучил, а в справке не всегда хорошо ориентируюсь. ;)

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

СообщениеДобавлено: 24 сен 2015, 11:01
samana
Я бы и сам не догадался, в сети нашел решение.

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

СообщениеДобавлено: 04 ноя 2016, 16:17
TonyMax
Вам нужно, чтобы луч не проходит сквозь UI? Тогда

Огромное спасибо, отличное решение

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

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


Спасибо, работает. Но обьясните, почему?
https://docs.unity3d.com/ScriptReferenc ... bject.html как то не очень понятно. Как соотносится EventSystem к UI ?

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

СообщениеДобавлено: 23 янв 2018, 21:56
samana
z-red писал(а):Как соотносится EventSystem к UI ?

UI ведь работает за счёт системыСобытий. Вообще это обширная тема, я мало о ней знаю, вот справка на русском https://docs.unity3d.com/ru/current/Man ... ystem.html

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

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

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

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

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

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

СообщениеДобавлено: 15 июл 2021, 19:15
Baluska
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;
                }
            }
        }
}
 

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

СообщениеДобавлено: 15 июл 2021, 19:24
Baluska
мне нужно чтоб плейер не двигался когда я нажимаю на ui, на пк всё ок работает, а при билде на телефоне он бежит в место под ui.

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

СообщениеДобавлено: 17 июл 2021, 08:55
Baluska
Сам решил задачу)
Синтаксис:
Используется 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;
                    }
                }
            }
        }
    }
}