на Андроиде Physics.Raycast проходит сквозь UI

Программирование для iPhone & Android

на Андроиде Physics.Raycast проходит сквозь UI

Сообщение andreycom13 04 апр 2020, 18:46

Всем привет. Уже неделю не могу найти решения проблемы. В эдиторе все работает, на андроиде рейкасат проходит сквозь ui. Получается и кнопка срабатывает и рейкаст ловит все что под кнопкой. Уже перепробовал десятки вариантов наверно. Все что нашел в инете не помогает. Все что связано с EventSystem.current.IsPointerOverGameObject не работает. Юнити 2019.3. Как то писал такой же код в 2017 версии, там все норм было. Может что поменялось? В доках юньки что нашел перепробовал тоже уже. Помогите плиз!
andreycom13
UNец
 
Сообщения: 7
Зарегистрирован: 05 дек 2019, 14:03

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение 1max1 04 апр 2020, 18:54

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

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение andreycom13 04 апр 2020, 19:28

Проблемо в том, что луч сквозь ui проходит и только на андроиде. В эдиторе то if (!EventSystem.current.IsPointerOverGameObject()) работает. И в старых версиях юньки на андроиде такой подход то тоже работал. Какая альтернатива тогда есть Physics.Raycast?
Нашел такой способ:
Синтаксис:
Используется csharp
GraphicRaycaster uiRaycaster;
    // Start is called before the first frame update
    void Start()
    {
        uiRaycaster = GetComponent<GraphicRaycaster>();
    }

    // Update is called once per frame
    void Update()
    {
        if (EventSystem.current.IsPointerOverGameObject())
        {
            Global.IsPointerOverGameObject = true;
        }
        else
        {
            Global.IsPointerOverGameObject = false;
        }

        int i = 0;
        while (i < Input.touchCount)
        {
            //      Debug.Log(Input.GetTouch(i).fingerId);
            if (IsPointerOverUIObject(Input.GetTouch(i).position))
            {
                Global.IsPointerOverGameObject = true;
            }
            else
            {
                Global.IsPointerOverGameObject = false;
            }

            ++i;
        }
    }
    private bool IsPointerOverUIObject(Vector2 screenPosition)
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = screenPosition;
        List<RaycastResult> results = new List<RaycastResult>();
        uiRaycaster.Raycast(eventDataCurrentPosition, results);
        return results.Count > 0;
    }

тоже работает только в эдиторе
andreycom13
UNец
 
Сообщения: 7
Зарегистрирован: 05 дек 2019, 14:03

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение 1max1 04 апр 2020, 23:51

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

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение andreycom13 05 апр 2020, 19:14

Ну вобще то есть #if. Я не первый год в юнити. Вопрос в том, что после перехода с 2017 на 2019.3 появилась эта проблема. От 2019 версии отказаться не могу из за новых инструментов в ней. Хотелось бы найти решение а не банальные вопросы.
andreycom13
UNец
 
Сообщения: 7
Зарегистрирован: 05 дек 2019, 14:03

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение 1max1 05 апр 2020, 19:23

Вопросы возникают потому что ты выкладываешь не весь код, тут нет экстрасенсов.
EventSystem.current.IsPointerOverGameObject() не работает возможно потому что сначала проходит код рейкаста, а уже потом идет проверка.
Почему бы тебе в коде, где ты кликаешь, не кинуть этот ui-рейкаст, а уже потом если там нету кнопки, кинуть физический рейкаст?

Синтаксис:
Используется csharp
        if (Input.GetTouch(0).phase == TouchPhase.Began)
        {
            // делаем проверку на кнопку юи рейкастом
            // кидаем физ. рейкаст в зависимости от результата юи рейкаста
        }
Аватара пользователя
1max1
Адепт
 
Сообщения: 5134
Зарегистрирован: 28 июн 2017, 10:51

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение andreycom13 05 апр 2020, 22:42

весь код смысла нет выкладывать, так как я уже вариантов 20 наверно перебрал. Как ты предлагаешь тоже пробовал. Боюсь тут дело не в коде, а в чем то еще. Я же говорю что в 2017 юньке все работает без проблем. В эдиторе все варианты в принципе рабочие. Через Remote тоже работает. Уже устал каждый раз собирать проект чтоб проверить. В logcat ошибок нет. Кстати, в офф доках сейчас смотрел https://docs.unity3d.com/2018.2/Documentation/ScriptReference/EventSystems.EventSystem.IsPointerOverGameObject.html, выбрал версию 2019.3 и не нашел EventSystem. Может на что то заменили?
andreycom13
UNец
 
Сообщения: 7
Зарегистрирован: 05 дек 2019, 14:03

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение andreycom13 05 апр 2020, 22:59

И вот здесь написано Новая система ввода. Может и в этом причина быть. Так что буду дальше искать
andreycom13
UNец
 
Сообщения: 7
Зарегистрирован: 05 дек 2019, 14:03

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение 1max1 06 апр 2020, 06:53

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

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение andreycom13 06 апр 2020, 20:19

Спасибо за помощь. Вобщем вопрос решился. Создал новый проект перекинул активы и ассет с слоями и тегами, чтоб по новой не настраивать. И как ни странно все заработало. У меня уже нерва не хватает на такие юнитековские глюки. Как перешел на 2019.3 так и началось, с самой установки. То обновления ей не хватало KB...., то ошибки пустые в чистом проекте. Потом еще веселей. Перенес проект с 2017 версии, послетали все слои и теги, а у меня их под сотню. Неделя ушла чтоб все востановить. Пропали все материалы на террейнах. Потом подключил гугл плей сервисы, все ок. Подключил плагин апподил. И тут опять началось. Резолвер не работает корректно в 2019.3 из за изменения структуры андроид проектов. Неделя поисков безрезультатных. В итоге решилось экспортом в андроид студию с правкой там всех манифестов и грандлов. Вот и сейчас хз что. Вобщем на все что можно сделать за один день, ушел месяц.
andreycom13
UNец
 
Сообщения: 7
Зарегистрирован: 05 дек 2019, 14:03

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение Lastrush 23 сен 2020, 12:54

Для тех, кто не решает эту проблему удалением Unity, вот решение:
Синтаксис:
Используется csharp

using System.Collections.Generic;
private static bool IsPointerOverUIObject()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
#if !ANDROID
        eventDataCurrentPosition.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y,Input.mousePosition.z);
#else
        eventDataCurrentPosition.position = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y);
#endif
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
        return results.Count > 0;
    }
 





Нашел решение на этом форуме - https://forum.unity.com/threads/ispoint ... 1587109885

слегка его подправил... Смысл данного решения в том, что мы проверяем на существование на нашем пути UI, а не есть ли объект на нашем пути, как если бы мы использовали EventSystem.current.IsPointerOverGameObject(). Надеюсь поможет вам, мне помогло)
Lastrush
UNец
 
Сообщения: 1
Зарегистрирован: 23 сен 2020, 12:41

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение ustas235 22 май 2022, 18:03

Lastrush писал(а):Для тех, кто не решает эту проблему удалением Unity, вот решение:
Синтаксис:
Используется csharp

using System.Collections.Generic;
private static bool IsPointerOverUIObject()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
#if !ANDROID
        eventDataCurrentPosition.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y,Input.mousePosition.z);
#else
        eventDataCurrentPosition.position = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y);
#endif
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
        return results.Count > 0;
    }
 





Нашел решение на этом форуме - https://forum.unity.com/threads/ispoint ... 1587109885

слегка его подправил... Смысл данного решения в том, что мы проверяем на существование на нашем пути UI, а не есть ли объект на нашем пути, как если бы мы использовали EventSystem.current.IsPointerOverGameObject(). Надеюсь поможет вам, мне помогло)


Спасибо тебе, добрый человек! Не первый день бьюсь с этой проблемой.
ustas235
UNец
 
Сообщения: 23
Зарегистрирован: 25 мар 2018, 10:24

Re: на Андроиде Physics.Raycast проходит сквозь UI

Сообщение DKV666 17 сен 2022, 00:26

Lastrush писал(а):Для тех, кто не решает эту проблему удалением Unity, вот решение:
Синтаксис:
Используется csharp

using System.Collections.Generic;
private static bool IsPointerOverUIObject()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
#if !ANDROID
        eventDataCurrentPosition.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y,Input.mousePosition.z);
#else
        eventDataCurrentPosition.position = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y);
#endif
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
        return results.Count > 0;
    }
 





Нашел решение на этом форуме - https://forum.unity.com/threads/ispoint ... 1587109885

слегка его подправил... Смысл данного решения в том, что мы проверяем на существование на нашем пути UI, а не есть ли объект на нашем пути, как если бы мы использовали EventSystem.current.IsPointerOverGameObject(). Надеюсь поможет вам, мне помогло)


Красава!!! Реально работает хорошо! Спасибо добрый человек!!!
DKV666
UNец
 
Сообщения: 2
Зарегистрирован: 12 сен 2022, 11:11


Вернуться в iPhone & Android

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

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