Традиционный игровой ввод
Unity поддерживает ввод с клавиатуры, джойстика и гейпада.
Виртуальные оси и кнопки могут быть созданны в Input Manager , и конечные пользователи смогут настраивать ввод с клавиатуры на экране конфигурационного диалогового окна.
Вы можете настроить джойстики, геймпады, клавиатуру и мышь, затем обращаться к ним через один простой скриптовый интерфейс.
Virtual Axes
Из скриптов все виртуальные оси доступны по их именам.
Каждый проект при создании содержит следующие оси ввода по умолчанию:
- Horizontal и Vertical привязаны к w, a, s, d и клавишам направления.
- Fire1 , Fire2 , Fire3 привязаны к клавишам Control, Option (Alt) и Command соответственно.
- Mouse X и Mouse Y привязаны к перемещениям мыши.
- Window Shake X и Window Shake Y привязаны к перемещению окна.
Добавление новых осей ввода
Если вы желаете добавить новые виртуальные оси, перейдите в меню Edit->Project Settings->Input . Здесь вы можете также изменить настройки каждой оси.
Вы привязываете каждую ось к двум кнопкам на джойстике, мыши или клавиатуре.
Свойство: | Функция: |
---|---|
Name | Имя, используемое для проверки этой оси из скрипта. |
Descriptive Name | Имя положительного значения, отображаемое на вкладке Input диалогового окна Configuration в автономных сборках. |
Descriptive Negative Name | Имя отрицательного значения, отображаемое на вкладке Input диалогового окна Configuration в автономных сборках. |
Negative Button | Кнопка, используемая для смещения значения оси в отрицательном направлении. |
Positive Button | Кнопка, используемая для смещения значения оси в положительном направлении. |
Alt Negative Button | Альтернативная кнопка, используемая для смещения значения оси в отрицательном направлении. |
Alt Positive Button | Альтернативная кнопка, используемая для смещения значения оси в положительном направлении. |
Gravity | Скорость в единицах в секунду, с которой ось возвращается в нейтральное положения, когда кнопки не нажаты. |
Dead | Размер аналоговой мертвой зоны. Все значения аналоговых устройств, попадающие в этот диапазон, считаются нейтральными. |
Sensitivity | Скорость в единицах в секунду, с которой ось движется к заданному значению. Только для цифровых устройств. |
Snap | Если включено, значение оси будет сбрасываться в ноль при нажатии кнопки в противоположном направлении. |
Invert | Если включено, Negative Buttons будут выдавать положительные значения, и наоборот. |
Type | Тип ввода, который будет управлять осью. |
Axis | Ось подключенного устройства, которая будет управлять этой осью. |
Joy Num | Подключенный джойстик, который будет управлять этой осью. |
Используйте эти параметры для точной настройки внешнего вида ввода. Также, все они задокументированы во всплывающих подсказках в редакторе.
Использование осей ввода из скриптов
Вы можете запросить текущее состояние из скрипта так:
value = Input.GetAxis ("Horizontal");
Это в случае ввода с джойстика и клавиатуры.
Однако изменения осей Mouse и Window Shake показывают, насколько мышь или окно сдвинулись по сравнению с последним кадром. Это значит, что они могут быть больше, чем 1 или меньше, чем –1, когда пользователь быстро двигает мышь.
Можно создавать несколько осей с одним именем. При получении ввода, будет возвращаться ось с наибольшим абсолютным значением. Это позволяет назначить больше одного устройства ввода на одно имя оси. Например, создайте одну ось для ввода с клавиатура и одну ось для ввода с джойстика с одинаковым именем. Если пользователь использует джойстик, ввод будет идти с джойстика, иначе ввод будет идти с клавиатуры. Таким образом, вам не нужно учитывать откуда приходит ввод при написании скриптов.
Названия кнопок
Чтобы назначить кнопку оси, вам необходимо ввести имя кнопки в свойстве Positive Button или Negative Button в окне Inspector .
Keys (Клавиши)
Названия кнопок следуют этому соглашению:
- Обычные клавиши“: ”a“, ”b“, ”c» …
- Цифровые клавиши: “1”, “2”, “3”, …
- Клавиши стрелок: “up”, “down”, “left”, “right”
- Клавиши цифровой клавиатуры: “[1]”, “[2]”, “[3]”, “[+]”, “[equals]”
- Клавиши модификаторов: “right shift”, “left shift”, “right ctrl”, “left ctrl”, “right alt”, “left alt”, “right cmd”, “left cmd”
- Клавиши мыши: “mouse 0”, “mouse 1”, “mouse 2”, …
- Кнопки джойстика (от любого джойстика): “joystick button 0”, “joystick button 1”, “joystick button 2”, …
- Кнопки джойстика (от заданного джойстика): “joystick 1 button 0”, “joystick 1 button 1”, “joystick 2 button 0”, …
- Специальные клавиши: “backspace”, “tab”, “return”, “escape”, “space”, “delete”, “enter”, “insert”, “home”, “end”, “page up”, “page down”
- Функциональные клавиши: “f1”, “f2”, “f3”, …
Названия, используемые для определения кнопок одни и те же при написании скриптов и в окне Inspector.
value = Input.GetKey ("a");
Ось может иметь значение от –1 до 1. На нейтральное положение указывает 0. Note also that the keys are accessible using the KeyCode enum parameter.
Управление персонажем с джойстика за 7 минут в Unity
Всем привет! Хочу поделиться видео, в котором показано как быстро создать управление персонажем в Unity с помощью джойстика. Более того, этот способ подойдет и для простого ввода с клавиатуры, по этому обязательно посмотрите этот ролик и вы обязательно подчерпнете что-то полезное для себя!) Так же можете посмотреть плейлист по созданию персонажа, где уже несколько интересных роликов и их количество будет обязательно пополняться!
Создание виртуального джойстика на юнити (основная статья)
Всем привет! В этой статье мы будем делать простой виртуальный джойстик на юнити.
Виртуальный джойстик (в дальнейшем буду называть его просто джойстик) — это крайне полезная вещь почти в каждой мобильной игре. С его помощью вы можете управлять движением персонажа, или сделать простое прицеливание, если вы делаете шутер.
Подготовка
Работа джойстика крайне проста — есть специальная «ручка» которую игрок двигает пальцем в определенной зоне. Когда нам нужно скажем, передвинуть персонажа, мы обращаемся к скрипту джойстика и он возвращает нам смещение ручки относительно одной или двух осей.
ВАЖНО! Смещение должно быть нормализованным. То есть максимальное значение по любой оси не должно быть больше единицы, а минимальное — минус единицы. Иначе будет трудно настроить ту же скорость движения персонажа. Например, нам нужно чтобы персонаж двигался с максимальной скоростью 3 метра в секунду. Если смещение будет нормализованным, то максимальная скорость персонажа будет равна заданной, то есть 3 м/с, если же оно не будет нормализованным, то скорость может быть равна, например 8 или 0,2 или 114 м/с.
Написание скрипта
Итак, приступим. Для начала нам нужно пару кругляшков для обозначения «зоны» и «ручки». Нарисовать их можно в фотошопе или где-нибудь ещё и экспортировать в юнити.
На сцене создаем канвас, создаем в нем объект с компонентом Image, кидаем в свойтво source image наш спрайт зоны и ставим в нужное место на экране. Готово! Это наш джойстик. Затем создаём скрипт управления джойстиком и вешаем на него. Далее создаем джойстику дочерний объект с тем же имаджем (не бейте пж за мой английский) и кидаем на него спрайт ручки. Это наша ручка (как ни странно).
Самая скучная работа закончена и можно начинать кодить.
Итак, прежде всего нам нужно отслеживать взаимодействие пользователя с джойстиком. Для этого будем использовать интерфейсы IDragHandler (для отслеживания «перетаскивания» джойстика пальцем) и IEndDragHandler (для того, чтобы знать когда пользователь убрал палец с джойстика). Объявляем класс наследником этих интерфейсов и реализуем их. Наш код должен выглядеть примерно так:
using UnityEngine; using UnityEngine.EventSystems; public class Joystick : MonoBehaviour, IDragHandler, IEndDragHandler < public void OnDrag(PointerEventData eventData) < //Движение пальцем по экрану >public void OnEndDrag(PointerEventData eventData) < //Конец движения пальца. >>
ВАЖНО! Обязательно добавьте CircleCollider2D на джойстик для регистрации нажатий по нему и не забудьте сделать его триггером. На основную камеру добавьте Physics 2D Raycaster для того чтобы узнавать о клике пальцем на джойстик.
Далее, нам нужно двигать ручку за пальцем. Для этого модифицируем наш скрипт:
Ок, теперь ручка теперь двигается за пальцем, но её движение нужно ограничить определенным радиусом. Порывшись в документации к юнити и попробовав пару костылей я нашел самый простой на мой взгляд способ сделать это.
Это Vector3.ClampMagnitude. Этот метод возвращает обрезанную до определенной длины копию вектора. То что нам и нужно. Модифицируем код.
Заключительные шаги. Теперь сделаем то, зачем мы все это затеяли. Получение направления от ручки до центра джойстика.
ВАЖНО! В коде ниже будут использоваться свойства. Почитайте, что это такое (если вы не знаете) чтобы понимать, что там происходит.
Это финальный скрипт. Больше мы не будем его дорабатывать.
P.S. Выше я использовал свойство, только затем, чтобы сэкономить пару операций и не изменять значение каждый кадр. А static я использовал, чтобы получать значение проще. Вот пример:
public class Player : MonoBehaviour < [SerializeField] float Speed; private void Update() < //Без static Joystick joystick = FindObjectOfType
Заключение
Так как статья получается довольно длинной, то различные модификации джойстика я не буду публиковать здесь. Для этого я создам отдельную статью, которая выйдет сегодня или (если мне будет лень) завтра.
Если вы хотите увидеть реализацию какой-нибудь другой механики в блоге, то пишите в комментариях. Также буду весьма раз фидбеку.
Как создать джойстик для Android в Unity?
В этой статье мы пошагово разберем создание просто джойстика под 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”. Его мы используем для отображения точки нажатия на поле джойстика. На этом можно сказать что подготовка элементов джойстика закончена.
Написание управляющего скрипта
Создадим 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)
Ограничим радиус действия джойстика равным 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;
Направление движения, которое передаст нам джойстик 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.
Готово. Нажимаем Play