Перетаскивание спрайтов в 2D игре - Форум Игроделов
Ср, 08 Май 2024, 22:03 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » ОБЩИЕ ВОПРОСЫ » Перетаскивание спрайтов в 2D игре (Не OnDrag OnDrop)
Перетаскивание спрайтов в 2D игре
NapalmRainДата: Пн, 04 Апр 2016, 11:02 | Сообщение # 1
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Доброго всем времени суток!

Продолжаю познавать основы создания двухмерных игр, и вот при создании очередного простенького прототипа захотелось мне реализовать простенькую механику:
Есть игровое поле и три кнопки "кубиков".
Моя задача взять пальцем один из кубиков и положить в нужную ячейку на игровом поле.


Первая мысль, которой я воспользовался - это стандартная механика, реализованная в Юнити - 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, но координаты выдаются совсем не похожие на правду...

Возможно я ошибаюсь изначально и идти нужно по иному пути.

Буду благодарен за любую подсказку!
 
СообщениеДоброго всем времени суток!

Продолжаю познавать основы создания двухмерных игр, и вот при создании очередного простенького прототипа захотелось мне реализовать простенькую механику:
Есть игровое поле и три кнопки "кубиков".
Моя задача взять пальцем один из кубиков и положить в нужную ячейку на игровом поле.


Первая мысль, которой я воспользовался - это стандартная механика, реализованная в Юнити - 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, но координаты выдаются совсем не похожие на правду...

Возможно я ошибаюсь изначально и идти нужно по иному пути.

Буду благодарен за любую подсказку!

Автор - NapalmRain
Дата добавления - 04 Апр 2016 в 11:02
ЛевшаДата: Пн, 04 Апр 2016, 15:04 | Сообщение # 2
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата NapalmRain ()
как мне при этом понять, есть ли у меня под пальцем какой-то нужный мне объект?

Для спрайтов и старого - обьектного гуя - Raycast
Еще у старого гуя есть метод HitTest, который в принципе применим и для спрайтов.
У нового гуя тоже есть нужные методы (на память не помню), которые можно найти в справке.


X.cor.R (Prologue)
 
Сообщение
Цитата NapalmRain ()
как мне при этом понять, есть ли у меня под пальцем какой-то нужный мне объект?

Для спрайтов и старого - обьектного гуя - Raycast
Еще у старого гуя есть метод HitTest, который в принципе применим и для спрайтов.
У нового гуя тоже есть нужные методы (на память не помню), которые можно найти в справке.

Автор - Левша
Дата добавления - 04 Апр 2016 в 15:04
NapalmRainДата: Пн, 04 Апр 2016, 22:16 | Сообщение # 3
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Цитата Левша ()
Для спрайтов и старого - обьектного гуя - Raycast

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

Код
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)
---------------------------------------------
На спрайтах висит коллайдер

 
Сообщение
Цитата Левша ()
Для спрайтов и старого - обьектного гуя - Raycast

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

Код
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)
---------------------------------------------
На спрайтах висит коллайдер


Автор - NapalmRain
Дата добавления - 04 Апр 2016 в 22:16
seamanДата: Пн, 04 Апр 2016, 22:30 | Сообщение # 4
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Я, конечно на андроиде не пробовал. Но с чего вдруг стандартная система Event-ов на нем работать не будет?
Вот эта:
http://docs.unity3d.com/ScriptReference/EventSystems.EventTrigger.html
В тот же OnBeginDrag передается в PointerEventData и pointerId, т.е. ид тача.
 
СообщениеЯ, конечно на андроиде не пробовал. Но с чего вдруг стандартная система Event-ов на нем работать не будет?
Вот эта:
http://docs.unity3d.com/ScriptReference/EventSystems.EventTrigger.html
В тот же OnBeginDrag передается в PointerEventData и pointerId, т.е. ид тача.

Автор - seaman
Дата добавления - 04 Апр 2016 в 22:30
ЛевшаДата: Пн, 04 Апр 2016, 22:59 | Сообщение # 5
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата NapalmRain ()
Поместил на сцену два спрайта и один куб, рейкаст реагирут только на куб...

рейкасту нет разницы на какой ГО реагировать, на куб или спрайт.
Он видит только их коллайдеры, подумай сам.


X.cor.R (Prologue)
 
Сообщение
Цитата NapalmRain ()
Поместил на сцену два спрайта и один куб, рейкаст реагирут только на куб...

рейкасту нет разницы на какой ГО реагировать, на куб или спрайт.
Он видит только их коллайдеры, подумай сам.

Автор - Левша
Дата добавления - 04 Апр 2016 в 22:59
NapalmRainДата: Вт, 05 Апр 2016, 08:50 | Сообщение # 6
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Цитата Левша ()
рейкасту нет разницы на какой ГО реагировать, на куб или спрайт.
Он видит только их коллайдеры, подумай сам.

Пара экспериментов привела к тому, что я понял в чём подвох: на спрайтах по умолчанию стояли и коллайдеры для спрайтов (2D), установил на спрайт трёхмерный коллайдер, всё сработало.
Цитата seaman ()
В тот же OnBeginDrag передается в PointerEventData и pointerId, т.е. ид тача.

Если верить статьям в интернетах и описанию, система должна работать, но на практике после использования данной системы на компе всё отработало как надо, а на смартфоне тишь да гладь... Совершенно никакой реакции на действия.

Добавлено (05 Апр 2016, 08:50)
---------------------------------------------
Ну что ж, пока решил вопрос рейкастами. Если верить профилировщику, ФПС сильно не страдает от этого, так что наверное так и оставлю.
Всем спасибо за советы!

 
Сообщение
Цитата Левша ()
рейкасту нет разницы на какой ГО реагировать, на куб или спрайт.
Он видит только их коллайдеры, подумай сам.

Пара экспериментов привела к тому, что я понял в чём подвох: на спрайтах по умолчанию стояли и коллайдеры для спрайтов (2D), установил на спрайт трёхмерный коллайдер, всё сработало.
Цитата seaman ()
В тот же OnBeginDrag передается в PointerEventData и pointerId, т.е. ид тача.

Если верить статьям в интернетах и описанию, система должна работать, но на практике после использования данной системы на компе всё отработало как надо, а на смартфоне тишь да гладь... Совершенно никакой реакции на действия.

Добавлено (05 Апр 2016, 08:50)
---------------------------------------------
Ну что ж, пока решил вопрос рейкастами. Если верить профилировщику, ФПС сильно не страдает от этого, так что наверное так и оставлю.
Всем спасибо за советы!


Автор - NapalmRain
Дата добавления - 05 Апр 2016 в 08:50
Форум Игроделов » UNITY3D » ОБЩИЕ ВОПРОСЫ » Перетаскивание спрайтов в 2D игре (Не OnDrag OnDrop)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024