IPointerDownHandler не срабатывает на телефоне
возникла серьезная проблема, я пытаюсь реализовать систем инвентаря для мобильного телефона, суть в том, что когда игрок нажимает на ячейку инвентаря, должен запускаться таймер величиной в 1 секунду по истечению которого содержимое ячейки инвентаря должно input.mouse.position, чтобы перекладывать вещи в другие ячейки, но это всё особо не имеет значения, поскольку на компьютере IPointerDownHandler работает идеально и никаких вопросов нету, а при билде и тесте на телефоне IPointerDownHandler не срабатывает совершенно, что ещё сильнее загнало меня в тупик — то, что UpHandler, находящийся в том же скрипте работает идеально как на пк так и на телефоне. прошу подсказать из за чего могла возникнуть такая неполадка и как можно ее устранить. конечная цель — обработать нажатие на 2D спрайт ячейки
скрипт находится на ячейке инвентаря
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Запрос срабатывает в SQL Server, но не корректно срабатывает в Visual Studio 2017
(SELECT ROW_NUMBER() over (ORDER BY AVG(Отметки.Отметка) DESC) ID, .ФИО, .Группа, Отметки.
Таймер срабатывает раньше времени или вообще не срабатывает
Помогите, пожалуйста, разобраться, что нетак с таймером. Браузер Chrome При создании записи.
Wi-fi на телефоне
Почему то нет вай фая на телефоне!! Хотя на ноутбук всё раздает! Дело не в телефоне, т.к проверял в.
Глюки в телефоне
Телефон sansung galaxy s7 за 2 недели использования выдает такие вот финты: сеть полная звонки не.
OnMouseDown на телефоне
Всем привет, есть у меня некая 2D игра, суть которой проста, ловить падающие объекты, на объект я.
Вирус в телефоне
При сканировании антивирусом,у меня на андройде нашелся системный файл.
Вирус на телефоне
Добрый день! Хочу установить пару программ на телефон (смартфон). Существуют ли мобильные вирусы.
Просмотреть БД в телефоне
Здравствуйте, я написал программу с локальной бд и SharedPreferences, как можно просмотреть эти.
Источник
Работа с EventSystem в Unity. Базовые вещи в работе с UI
Всем привет! Давно ничего не писал, но сейчас захотелось рассказать про очень удобную штуку, о которой многие не знают. Это Event System в Unity. Многие, для задач в которых EventSystem очень удобен, используют обычный Raycast. Я расскажу про то, как пользоваться частью функционала EventSystem (его на самом деле очень много) и как этот инструмент позволяет быстро решать многие задачи связанные с обработкой событий интерфейсов и объектов. Как всегда с репозиторием с примерами. Если вам интересно — добро пожаловать под кат!
В данной статье я разберу и предоставлю примеры работы с событиями IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IDragHandler, IBeginDragHandler, IEndDragHandler (полный список событий можно посмотреть тут).
Что же такое EventSystem? EventSystem — это система отвечающая за обработку разных событий в сцене. В основном она позволяет:
- Определять какой GameObject “выбран”
- Управлять способами ввода которые используются
- Управлять рейкастингом
Подробнее всего в данной статье мы разберём третий пункт, так как он самый простой и удобный в использовании.
С точки зрения рейкастов в EventSystem доступны три основных компонента:
- Graphic Raycaster — используется для работы с UI
- Physics 2D Raycaster — используется для взаимодействия с физическими объектами в 2D
- Physics Raycaster — используется для взаимодействия с физическими объектами в 3D
Важная деталь для всех взаимодействий будь то физика или ui необходимо чтобы объект EventSystem присутствовал на сцене.
Начнём с самого простого — с UI системы. С ней EventSystem работает проще всего и лучше всего. Дело в том, что при создании Canvas юнити сразу добавляет на сцену все необходимые компоненты, такие как сам EventSystem и Graphic Raycaster.
В случае с UI, событийная система позволяет легко создавать свои кнопки и базовые взаимодействия с разными UI элементами. Для примера разберём IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IDragHandler, IBeginDragHandler, IEndDragHandler.
Чтобы UI элемент реагировал на события входа (IPointerEnterHandler), выхода (IPointerExitHandler) курсора мыши необходимо имплементировать эти интерфейсы в необходимый объект. Это помогает во многих случаях, когда нужно что-то выбрать, подсветить и т.п. На примере с тестовой сценой и Image это позволяет сделать интеракции вроде такой в несколько строк кода:
Для обработки событий нажатия на UI элемент есть два других интерфейса IPointerDownHandler, IPointerUpHandler.
Их имплементация позволяет в удобном виде обрабатывать события нажатия на объект мышью или тача на мобильных платформах:
EventSystem работает с любым компонентом UI системы, который может быть RaycastTarget. Для примера Text и событие клика IPointerClickHandler (важно, это событие похоже на IPointerUpHandler, то есть срабатывает в момент поднятия мыши, но отличие заключается в том, что “отпускание” курсора должно происходить строго в границах объекта):
Самыми интересными ивентами на мой взгляд, являются те, что позволяют удобно делать Drag. Это набор интерфейсов IDragHandler, IBeginDragHandler, IEndDragHandler. С ними так же всё очень просто. Визуальный эффект сильно зависит от способа обработки, но эти три события позволяют делать самые разные взаймодействия за несколько минут. В случае, если элемент, который вы собираетесь двигать состоит из разных UI элементов, важно отключать галочку RaycastTarget на тех элементах, которые не являются интерактивными. (Важно: в случае с UI системой нужно использовать screenPosition из PointerEventData которая приходит во всех методах событийной системы связанных с мышью/тачем)
В общем то по UI системе всё, на самом деле там есть ещё несколько полезных штук с точки зрения Event System, но про них я может напишу в будущих статьях.
Работа с физическими объектами отличается лишь двумя пунктами. Первое — надо внимательно следить, чтобы объект EventSystem был на сцене, чтобы это работало. Второе — надо повесить компонент PhysicsRaycaster на основную камеру, чтобы всё это так же работало по коллайдерам. В остальном почти тоже самое, простенький пример вы можете найти в репозитории.
В общем EventSystem крутой и удобный инструмент, который позволяет многие вещи делать в разы быстрее нежели обычными рейкастами. Кроме того в EventSystem есть очень много полезного функционала вроде того, что там можно переопределять инпуты (к примеру вас интересует специфичный контроллер, скажем Leap Motion) и многое другое, о чём я может напишу в будущих статьях.
Источник
Использование подхода IPointerDownHandler в Unity3D, но «на весь экран»
В Unity говорят, что вам нужно обнаруживать прикосновение пальцем (рисование пальцем) к чему-либо в сцене.
Единственный способ сделать это в современном Unity очень прост :
Шаг 1 . Поместите коллайдер на этот объект. («Земля» или что-то еще.) 1
Шаг 2. На панели инспектора камеры нажмите, чтобы добавить Physics Raycaster (2D или 3D в зависимости от ситуации).
Шаг 3. Просто используйте код, как в примере А ниже.
(Совет — не забудьте убедиться, что существует EventSystem . иногда Unity добавляет ее автоматически, иногда нет!)
Фантастика, не может быть проще. Наконец, Unity корректно обрабатывает un / Распространение через слой пользовательского интерфейса. Работает единообразно и безупречно на рабочем столе, устройствах, в редакторе и т. Д. Ура, Unity.
Все хорошо. Но что, если вы хотите рисовать просто «на экране» ?
Итак, вы просто хотите, чтобы пользователь проводил / касался / рисовал «на экране». (Например, просто для управления орбитальной камерой, скажем.) Так же, как и в любой обычной трехмерной игре, где камера бегает и движется.
Вам не нужно положение пальца на каком-либо объекте в мировом пространстве, вам просто нужны абстрактные «движения пальца» (то есть положение на стекле).
Какой коллайдер вы тогда используете? Можете ли вы сделать это без коллайдера? Добавление коллайдера только по этой причине кажется глупым.
Что мы делаем:
Я просто делаю какой-то плоский коллайдер и прикрепляю его под камерой . Таким образом, он просто сидит в усечке камеры и полностью закрывает экран.
(Для кода тогда нет необходимости использовать ScreenToWorldPoint, поэтому просто используйте код, как в примере B — очень просто, отлично работает.)
Мой вопрос, мне кажется немного странным использовать описываемый мною «коллайдер под камерой», просто чтобы прикоснуться к стеклу.
(Примечание — пожалуйста, не отвечайте с использованием древней системы Unity «Touches», которая сегодня неприменима для реальных проектов, вы не можете игнорировать .UI, используя устаревший подход.)
Пример кода A — рисование на объекте сцены. Используйте ScreenToWorldPoint.
Пример кода B . вас волнует только то, что пользователь делает на стеклянном экране устройства. Здесь еще проще:
2 ответа
Вопрос и ответ, который я собираюсь опубликовать, в значительной степени основаны на мнении. Тем не менее я отвечу как можно лучше.
Если вы пытаетесь обнаружить события указателя на экране, нет ничего плохого в представлении экрана с помощью объекта. В вашем случае вы используете 3D-коллайдер, чтобы покрыть всю усеченную поверхность камеры. Однако в Unity есть собственный способ сделать это, используя объект 2D UI, который покрывает весь экран. Экран лучше всего может быть представлен в виде 2D-объекта. Для меня это кажется естественным способом сделать это.
Для этой цели я использую общий код:
Screen — это синглтон, потому что в контексте игры есть только один экран. Объекты (например, камера) подписываются на события указателя и соответственно организуются. Это также сохраняет единоличную ответственность.
Вы могли бы использовать это как добавление к объекту, который представляет так называемое стекло (поверхность экрана). Если вы думаете, что кнопки на пользовательском интерфейсе выходят за пределы экрана, под ними будет стекло. Для этого стакан должен быть первым дочерним элементом Canvas . Конечно, Canvas должен быть отображен в пространстве экрана, чтобы он имел смысл.
Здесь есть один бессмысленный прием — добавить в стакан невидимый компонент Image , чтобы он получал события. Это действует как цель для стекла.
Вы также можете использовать Input ( Input.touches и т. Д.) Для реализации этого стеклянного объекта. Это будет работать как проверка того, изменялся ли ввод при каждом вызове Update . Мне это кажется подходом, основанным на опросах, тогда как вышеупомянутый подход основан на событиях.
Ваш вопрос выглядит так, как будто вы ищете способ оправдать использование класса Input . ИМХО, не усложняйте себе. Используйте то, что работает. И примите тот факт, что Unity не идеальна.
Прежде всего, вы должны понимать, что есть всего 3 способов определить щелчок по объекту с помощью функции OnPointerDown :
1 . Вам нужен компонент пользовательского интерфейса, чтобы обнаруживать клики с помощью функции OnPointerDown . Это относится к другим аналогичным событиям пользовательского интерфейса.
2 . Другой метод обнаружения щелчка с помощью функции OnPointerDown в 2D / Sprite GameObject — это прикрепить Physics2DRaycaster к камере, после чего будет вызван OnPointerDown когда по нему щелкают. Обратите внимание, что к нему должен быть прикреплен 2D-коллайдер .
3 . Если это 3D-объект с Коллайдером, а не 2D Collider , вы должны иметь PhysicsRaycaster , прикрепленный к камере, чтобы OnPointerDown вызываемая функция.
Делать это с помощью первого метода кажется более разумным, вместо того, чтобы иметь большой коллайдер или 2D-коллайдер, закрывающий экран. Все, что вам нужно сделать, это создать Canvas , Panel GameObject и прикрепить к нему компонент Image , который растягивается на весь экран.
Чувак, я просто не вижу в использовании .UI серьезного решения: представьте, что мы делаем большую игру, и вы возглавляете команду, которая занимается всем UI (я имею в виду кнопки, меню и все такое). Я возглавляю команду, занимающуюся шагающими роботами. Я внезапно говорю вам: «о, кстати, я не могу справиться с прикосновением («! «), Не могли бы вы добавить UI.Panel, не забывайте держать его под всем, что вы делаете, ну и вставьте один на любом / всех холстах или камерах, между которыми вы переключаетесь — и передайте эту информацию мне, хорошо! » 🙂 То есть это просто глупо. По сути, нельзя сказать: «О, Unity не обрабатывает прикосновения»
Не очень сложно, как вы это описали. Вы можете написать длинный код, который сможет создавать Canvas , Panel и Image . Измените альфа-канал изображения на 0 . Все, что вам нужно сделать, это прикрепить этот код к Camera или пустому GameObject, и он выполнит все это автоматически в режиме игры.
Сделайте так, чтобы каждый GameObject, который хочет получать событие на экране, подписался на него, затем используйте ExecuteEvents.Execute для отправки события всем интерфейсам в скрипте, прикрепленном к этому GameObject.
Например, приведенный ниже пример кода отправит событие OnPointerDown в GameObject с именем target.
Проблема, с которой вы столкнетесь :
Скрытый компонент Image заблокирует другой пользовательский интерфейс или GameObject от получения raycast. Это самая большая проблема.
Решение :
Поскольку это вызовет некоторые проблемы с блокировкой, лучше сделать холст изображения поверх всего. Это гарантирует, что теперь он 100 блокирует все остальные UI / GameObject. Canvas.sortingOrder = 12; должен помочь нам в этом.
Каждый раз, когда мы обнаруживаем такое событие, как OnPointerDown в изображении, мы вручную повторно отправляем событие OnPointerDown всем другим UI / GameObject под Image .
Прежде всего, мы создаем raycast с GraphicRaycaster (UI), Physics2DRaycaster (2D-коллайдер), PhysicsRaycaster (3D Collider) и сохраняем результат в List .
Теперь мы перебираем результат в списке и повторно отправляем событие, которое мы получили, отправив искусственное событие в результаты с помощью:
Другие проблемы, с которыми вы можете столкнуться :
Вы не сможете отправлять имитирующие события в компоненте Toggle с помощью GraphicRaycaster . Это ошибка в Unity. На это у меня ушло 2 дня.
Также не удалось отправить поддельное событие перемещения ползунка в компонент Slider . Я не могу сказать, ошибка это или нет.
Помимо этих проблем, упомянутых выше, мне удалось это реализовать. Он состоит из 3 частей. Просто создайте папку и поместите в нее все скрипты.
СКРИПТЫ :
1 . WholeScreenPointer.cs — основная часть скрипта, которая создает Canvas , GameObject и скрытый Image . Он делает все сложные вещи, чтобы гарантировать, что Image всегда покрывает экран. Он также отправляет событие всем подписавшимся GameObject.
2 . EventForwarder.cs — он просто получает любое событие от скрытого Image и передает его скрипту WholeScreenPointer.cs для обработки.
3 . EventUnBlocker.cs — разблокирует лучи, которые блокирует скрытый Image , отправив поддельное событие любому объекту над ним. Будь то UI, 2D или 3D коллайдер.
Использование :
1 . Прикрепите сценарий WholeScreenPointer к пустому GameObject или Camera.
2 . Чтобы получить любое событие в сцене, просто реализуйте IDragHandler , IPointerDownHandler , IPointerUpHandler в любом скрипте, а затем вызовите WholeScreenPointer.Instance.registerGameObject(this.gameObject); один раз. Любое событие с экрана теперь будет отправлено в этот сценарий. Не забудьте отменить регистрацию в функции OnDisable() .
Например, прикрепите Test к любому GameObject, который хотите получать события касания:
Источник