Управление через тачскрины на мобильных устройствах – важная часть разработки игр под мобильные платформы. В этом руководстве рассмотрена реализация простого управления с помощью стрелочек на экране, используя Unity3D. В результате получено плавное управление кубиком на экране посредством касаний.
Структура кода
Для реализации многоплатформенного управления используется интерфейс IController. Он позволяет абстрагироваться от способа ввода (кнопки, клавиатура, тачскрин) и использовать различные контроллеры без переписывания кода. Интерфейс содержит методы для получения горизонтального и вертикального значений управления.
На основе этого интерфейса создан класс UInputController, отвечающий за отрисовку кнопок на экране и обработку касаний. Класс CubeController взаимодействует с управляемым кубиком, используя интерфейс IController для получения данных об управлении.
Класс CubeController
Этот класс содержит переменную типа IController, позволяющую использовать любой контроллер, реализующий данный интерфейс. В методе Start() вызывается функция PickInputController(), которая выбирает подходящий контроллер для текущей платформы.
Метод PickInputController() использует директивы препроцессора #if для компиляции кода, соответствующего текущей платформе. Например, для Android компилируется код, возвращающий UInputController, а для других платформ – другой контроллер (если потребуется). Список доступных платформ можно найти в документации Unity.
Класс UInputController
Этот класс отвечает за обработку касаний на экране. Он использует Rect для определения зон нажатия (стрелки вверх, вниз и т.д.). Для отрисовки кнопок используются переменные типа Texture2D.
Переменная screenAspect хранит соотношение сторон экрана, используется для пересчета размеров Rect при изменении ориентации экрана. Это предотвращает необходимость постоянных вычислений каждый кадр. Для позиционирования элементов используется процентное соотношение от ширины и высоты экрана, обеспечивая адаптивность под разные разрешения. Функция OnGUI() отвечает за отрисовку текстур кнопок.
Обработка касаний
Метод GetTouchContains() проверяет, находится ли касание в заданном Rect. Важно учесть, что координаты Rect отсчитываются от левого верхнего угла, а координаты касания – от левого нижнего. Поэтому необходимо инвертировать значение Y-координаты касания.
Метод перебирает все касания (массив Input.touches) и проверяет каждое на попадание в указанный Rect. Структура Touch содержит информацию о положении, типе и идентификаторе касания. Типы касаний позволяют различать начало, конец, движение и статическое состояние. Для детальной информации о типах касаний (TouchPhase) рекомендуется обратиться к документации Unity.
Важные моменты
Не рекомендуется использовать Input.GetTouch(0) для обработки касаний, так как это ограничивает обработку только одним касанием. Необходимо перебирать все элементы массива Input.touches для корректной работы мультитач.
Данное руководство описывает простой, но эффективный способ реализации управления для мобильных устройств в Unity3D. Использование интерфейса IController обеспечивает гибкость и расширяемость, а корректная обработка массива Input.touches позволяет реализовать полноценную поддержку мультитач. Обратите внимание на использование относительных размеров элементов интерфейса для обеспечения адаптивности под разные разрешения экранов.