Джойстик для андроид unity

Джойстик для андроид unity

В этом уроке мы разберем, как сделать джойстик в Unity 5, работающий на всех платформах, включая Android и IOS. Для начала имеем: пустой проект и Canvas на нем. Если вы не знаете, что такое Canvas, или не разобрались в нем (например, не знаете как сделать масштабируемость интерфейса), то рекомендую посмотреть урок по созданию главного меню для того, чтоб лучше в этом разобраться.

Canvas мы переименуем как MobileInputCanvas и создадим на нем Image, который назовем JoystickHolder, выберем ему необходимый размер (изменив width и height свойства), а так же поставим его в нужное место. В Image мы выберем нужный спрайт, если у вас есть заготовки для спрайтов под джойстик и место, где от будет кататься, а если нет, то можете выбрать уже готовый круг. Для этого необходимо выбрать нужный нам объект Image и выбрать св-во Source Image. Далее в Unity уже есть картинка Knob, нужно выбрать именно её. Следующим мы создадим в JoystickHolder еще один Image, который назовем Joystick и проделаем с ним те же действия, но поменяем ему размер на более меньший. А так же нужно перекрасить наши круги в необходимые для вас цвета. В конце этих действий получиться что-то похожее на это:

Теперь необходимо написать статический класс, который будет хранить в себе все значения из нашего джойстика. Для этого создадим класс AndroinIosInput и напишем в нем:

В этой статье мы пошагово разберем создание просто джойстика под Android, а также рассмотрим работу контроллера персонажа игры.

Подготовим сцену и элементы джойстика

Camera. Выбираем в сцене камеру, по умолчанию она названа Main Camera. И переключаем Clear Flags на Solid Color. Теперь камера будет отображать фон сплошным цветом заданным в поле Background.

Теперь займемся основой джойстика

Для основы используем элемент UI под названием Image. В нем нам важна возможность отрисовывать фон джойстика и компонент Rect Transform. Создадим Image и переименуем его Joystic. В Rect Transform устанавливаем значения width и height равными 300. Это высота и ширина картинки. Далее обратим внимание на компонент Image.

Этот элемент отображает изображение для пользователя. Source image, как понятно из названия – источник изображения. В это поле назначаем спрайт с изображением джойстика. Теперь надо расположить наш джойстик на экране. В окне Hierarchy выберем Joystic и в окне Editor переместим его в подходящее место. Например, нижний левый угол.

Далее нам потребуется еще один Image. Создадим его и назовем “Touch_marker”. Его мы используем для отображения точки нажатия на поле джойстика. На этом можно сказать что подготовка элементов джойстика закончена.

Читайте также:  Как обновить ключ продукта windows 10 читать

Написание управляющего скрипта

Создадим C# Script назовем его Joystic_controller и откроем его в редакторе.

Далее в скрипте объявим 3 переменные. Первая будет хранить ссылку на наш Joystic_touch, чтобы мы могли управлять им. А именно, перемещать его в центр джойстика, если на экран не было нажатий, а при нажатии на экран – в координаты, где произошло касание экрана.

Следующая переменная, приватная типа Vector3. В ней мы будем хранить вектор направленный из центра джойстика в координаты касания экрана. Vector3 tаrget_vector;

И последняя переменная – та, в которой мы будем хранить ссылку на класс, управляющий персонажем. public Square_green_controller sg_controller;

Ниже идет метод Start, который вызывается при старте сцены. В него мы добавим строку, перемещающую touch_marker в центр гейм объекта, к которому прикреплен скрипт. Это на случай, если при сборке сцены touch_marker находится не в центре джойстика.

if (Input.GetMouseButton(0))

Проверяем. Если нажата левая кнопка мыши или произошло касание экрана, Модуль Unity Input позволяет для отслеживания touch использовать мышку. То есть Input.mouse будет работать и на телефоне. И если кнопка (касание) нажата (произошло), записываем координаты касания в локальную переменную Vector3.

Vector3 touch_pos = Input.mousePosition;

Чтобы полностью переключится на мобильные платформы, достаточно поменять Input.GetMouseButton(0) на Input.touchCount >0 и Input.mousePosition на Input.GetTouch (0).position, где 0 означает, что мы записываем координаты первого касания. Следующее что мы делаем, это получаем вектор направления.

tаrget_vector = touch_pos – transform.position;

Делается это путем вычитания одной точки в пространстве из координат другой, и получается вектор, который “выходит” из второй точки и “заканчивается” в первой. Так же модуль данного вектора равен расстоянию между двумя позициями. Чем мы и воспользуемся для ограничения зоны действия джойстика. if (tаrget_vector.magnitude Ограничим радиус действия джойстика равным 100. Если расстояние между позицией джойстика и точки касания экрана больше этого значения, то target_marker перемещается в центр джойстика, если меньше, то в точку касания экрана.

Далее передаем вектор направления классу, управляющему персонажем: sg_controller.target_move = tаrget_vector;

Затем проверяем, если нет нажатий на экран, то возвращаем target_marker в центр джойстика и второй строкой делаем вектор направления в классе персонажа нулевым, останавливая движение.

sg_controller.target_move= new Vector3(0, 0, 0);

Полностью скрипт выглядит так:

На этом контроллер джойстика можно считать законченным.

Создаем персонажа и скрипт управления для него

Опять создаем Image. Переименовываем в Square_green и в компоненте Image, в поле Color, выбираем зеленый. Height и width в компоненте Rect Transform выставим 50.

В нем объявляем две переменные. Скорость движения. Ее мы зададим в инспекторе. public float speed;

Читайте также:  Как установить libreoffice в linux

Направление движения, которое передаст нам джойстик public Vector3 target_move;

В Update первым делом ограничиваем движение персонажа границами экрана. Для этого используем Mathf.Clamp. функцию ограничения значения, то есть заключение его в определённый диапазон. От нуля которых находится в нижнем левом углу до противоположной границе экрана.

transform.position = new Vector3( Mathf.Clamp(transform.position.x, 0, Screen.width), transform.position.y, transform.position.z);

transform.position = new Vector3(transform.position.x, Mathf.Clamp(transform.position.y,0, Screen.height), transform.position.z);

И зададим движение через Translate где вектор направления движения задает джойстик.

transform.Translate(target_move * speed * Time.deltaTime);

Полностью скрипт выглядит так:

Контроллер персонажа готов. Осталось назначить скрипты гейм объектам и скриптам некоторые переменные.

Скрипт Joystic_controller мы назначаем Joystic. А Square_green_controller назначаем Square_green. Теперь в компоненте Joystic_controller мы назначим путем простого перетаскивания из окна иерархии: в поле touch_marker назначим Touch_marker, а в поле sg_controller назначим Square_green.

И конечно не забудем Square_green >Square_green_controller выставить значение Speed. Например 5.

Для работы на конкурс была поставлена задача: спроектировать небольшую игру про космос, которую дети будут проходить порядка 8 минут. И было одно но. Детям должно быть интересно!

Так как пожертвовать клавиатурой на управление было слишком жалко (да и не так это интересно), всё управление планировалось сделать через геймпад. О том, как прикрутить в Unity3d геймпад и пойдёт речь.

Немного о проекте

Первое, что пришло в голову про космос, так это управляемый робот. Развивая эту мысль дальше, игра стала про робота, который на Луне должен найти батарейку, чтобы зарядить лазерную станцию и спастись от приближающейся кометы. Разумеется все нужно было делать на время (до 8-ми минут).

(На удивление детям игра понравилась, в том числе за управление, но об этом ниже).

Картография

Для создания карты с небольшими закоулками и большим соответствием Луне, картой является элемент Terrain, с горами, которые нужны как препятствия и ограничения уровня.

Чтобы уровень был достаточно долгим, робот находится в противоположном углу от батарейки, которая крайне мала, чтобы увидеть издалека. Размер выбран не случайно, так как не позволяет увидеть батарейку заранее издалека.

Управление

Контроль за руками

Так как у робота две руки, как и количество "грибков" в геймпаде, то разумно этим воспользоваться.

И вот тут начинаются сложности. Дело в том, что первый "грибок" работает (хоть и со скрипом) так же, как и "Mouse X" и "Mouse Y", но второй никак не отзывался по нажатию. Тогда, сев за гугл, прочитал о том, как Unity получает входные управляющие данные. Там и лежит ответ на вопрос, как заставить работать второй (правый) "грибок".

Заходим Edit → Project Settings → Input

Нажали? Тогда должен появиться InputManager в окне Inspector

Читайте также:  Как узнать есть ли msata в ноутбуке

В начале будет 18 входных параметров, но нам нужно больше. Потому у меня 22 (на ось X и ось Y для второго "грибка" геймпада и ещё два, чтобы обособить имя обращения к первому "грибку").

Дальше по аналогии с движением мышки (Mouse X) заполняем и переименовываем новые входные значения (имя крайне важно, так как в программе именно к нему вы и обращаетесь).

lp_right.transform.Rotate (0, Input.GetAxis ("Hor2_j"), 0);
yr += Input.GetAxis ("Hor2_j");

lp_right.transform.Rotate (Input.GetAxis ("Vert2_j"),0, 0);
xr += Input.GetAxis ("Vert2_j");

lp_left.transform.Rotate (0, Input.GetAxis ("Hor_j"), 0);
yl += Input.GetAxis ("Hor_j");

lp_left.transform.Rotate (Input.GetAxis ("Vert_j"),0, 0);
xl += Input.GetAxis ("Vert_j");

Передвижение

Стоит помнить, что передвижение по координатам плохо скажется на игре, так как карта построена на Terrain. Потому было принято решение использовать физику. Это увеличивает интерес прохождения с одной стороны, а с другой решает несколько проблем сразу (неровное перемещение, скачки, вылет за ограждения).

А значит нужен Rigidbody, который нужно поместить на робота, а дальше на ваш вкус (в проекте выставлена масса 100, остальное осталось не тронутым).

В коде будут только два фокуса. Первый — GetComponent(), чтобы работать именно с Rigidbody и Addforce. Второй — математический. Нужно не только знать, куда хочет робот, но и знать, куда он смотрит. Для этого обращаемся к transform.eulerAngles.y, переводим в радианы и берем косинус и синус для координат x и z соответственно.

Как можно заметить, в действиях указаны по две кнопки. Это сделано на случай, если бампера (L1,L2,R1,R2) сломаются/залипнут при многократном использовании.

Время

Для уточнения настоящего времени в Unity можно использовать System.DateTime.Now, чтобы посчитать в секундах, сколько времени прошло от начала дня. Такой способ ограничения времени имеет недостаток — переход часов с 23:59 на 00:00, но так как игра на раз и конкурс будет проходить днем, то можно пренебречь

  • Считайте вместе с днем, месяцем и годом. Когда то видел такую функции в TurboC++, которая выдает количество секунд, прошедших с 1 января 1970
  • Прочитайте про таймеры и вызывающие функции в C#

Ограничение по времени тогда можно считать, как разницу во времени после запуска скрипта (void Start()) и тем, что сейчас (Update)

Послесловие

Детям игра понравилась, так как робот перемещался с ускорением, чем все охотно пользовались.

Особенно было интересно поймать батарейку до того, как ты в неё врежешься, так как она тоже Rigidbody и получит направление движения. В сочетании с медленным перемещением рук, получилось очень даже неплохо.

Надеюсь, что данная статья поможет вам не сидеть до поздней ночи, прикручивая геймпад к вашему проекту!

Ссылка на основную публикацию
Где автокад хранит автосохранение
Данная функция существенно облегчает работу в случае сбоев программы и ошибок в работе. По умолчанию, автосохранение в AutoCAD сохраняет файл...
Виндовс 10 видит принтер но не печатает
Windows 10 не видит принтер Плановая переустановка Виндовс 7 на 10: мошенники против пенсионеров Полноэкранная реклама от Windows - раздражающая...
Внутренняя программная ошибка src defaultfontmetrics cpp 55
Abbyy Finereader – программа для распознавания текста с изображениями. Источником картинок, как правило, является сканер или МФУ. Прямо из окна...
Где на жестком диске написан объем
Мы зарегистрировали подозрительный трафик, исходящий из вашей сети. С помощью этой страницы мы сможем определить, что запросы отправляете именно вы,...
Adblock detector