Продолжаю познавать основы создания двухмерных игр, и вот при создании очередного простенького прототипа захотелось мне реализовать простенькую механику: Есть игровое поле и три кнопки "кубиков". Моя задача взять пальцем один из кубиков и положить в нужную ячейку на игровом поле.
Первая мысль, которой я воспользовался - это стандартная механика, реализованная в Юнити - OnDrag. Но к сожалению, работает она только на винде, а мне нужно делать это на андроиде.
Поэтому вторая мысль, которую я решил использовать - это использовать стандартные функции кнопок ЮИ OnClick, но тут возникла проблема, что срабатывают эти функции только после того, как кнопку отпустят, а не при нажатии.
Посему пришёл к выводу, что буду просто отслеживать просто
Код
Input.Touch
То есть как-то так примерно:
Код
if (Input.touchCount > 0) if (Input.touches[0].phase = TouchPhase.Began) { // создаём новый экземпляр кубика по которому кликнули } if (Input.touches[0].phase = TouchPhase.Moved) { // передвигаем созданный экземпляр кубика } if (Input.touches[0].phase = TouchPhase.Ended) { // кладём кубик на игровое поле } }
Но в данном конкретном случае я столкнулся с двумя проблемами, которые так и не придумал как решить. Если точнее, то скорее всего проблема одна: как я смогу понять, в каком месте экрана я прикоснулся я знаю, но как мне при этом понять, есть ли у меня под пальцем какой-то нужный мне объект? Например тот же кубик или нужное игровое поле, куда его положить? Пробовал сравнивать координаты прикосновения и Bounds от Sprite Renderer, но координаты выдаются совсем не похожие на правду...
Возможно я ошибаюсь изначально и идти нужно по иному пути.
как мне при этом понять, есть ли у меня под пальцем какой-то нужный мне объект?
Для спрайтов и старого - обьектного гуя - Raycast Еще у старого гуя есть метод HitTest, который в принципе применим и для спрайтов. У нового гуя тоже есть нужные методы (на память не помню), которые можно найти в справке. X.cor.R (Prologue)
Возможно, я что-то не так делаю, но рейкаст не реагирует на спрайты. Поместил на сцену два спрайта и один куб, рейкаст реагирут только на куб...
Код
if (Input.GetMouseButton(0)) { ray = mainCamera.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(mainCamera.ScreenToWorldPoint(Input.mousePosition), Vector3.forward, Color.cyan); //пускаем луч бесконечной длинны и если попали куда то, то if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.collider.name); } }
Добавлено (04 Апр 2016, 22:16) --------------------------------------------- На спрайтах висит коллайдер
рейкасту нет разницы на какой ГО реагировать, на куб или спрайт. Он видит только их коллайдеры, подумай сам.
Пара экспериментов привела к тому, что я понял в чём подвох: на спрайтах по умолчанию стояли и коллайдеры для спрайтов (2D), установил на спрайт трёхмерный коллайдер, всё сработало.
Цитатаseaman ()
В тот же OnBeginDrag передается в PointerEventData и pointerId, т.е. ид тача.
Если верить статьям в интернетах и описанию, система должна работать, но на практике после использования данной системы на компе всё отработало как надо, а на смартфоне тишь да гладь... Совершенно никакой реакции на действия.
Добавлено (05 Апр 2016, 08:50) --------------------------------------------- Ну что ж, пока решил вопрос рейкастами. Если верить профилировщику, ФПС сильно не страдает от этого, так что наверное так и оставлю. Всем спасибо за советы!