Как сделать управление персонажем в unity при помощи сенсорных кнопок

Обновлено: 06.07.2024

В этом видео мы изучим объект Button в игровом движке Unity. Подробно узнаем про компоненты. * Научимся работать с .

Также модернизируя ввод данных создадим кнопку которая будет реагировать на нажатие с экрана телефона и выполнять .

В данном видео, я расскажу, как создать передвижение 2d персонажа с помощью сенсорных кнопок на экране. Ссылка на .

В этом видео мы узнаем, каким образом включать и отключать кнопки, изменять их цвет в разных состояниях и как .

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

Кроме этого мы решим проблему множественных нажатий, при которой нажатие несколькими пальцами на тачпад может .

using UnityEngine;
using System.Collections;

public class movePlayer : MonoBehaviour

private GameObject player; //Переменна объекта персонажа с которым будем работать.

public static int speed = 6; //Скорость перемещения персонажа. Запись public static обозначает что мы сможем обращаться к этой переменной из любого скрипта
public static int _speed; //постоянная скорость перемещения персонажа
public int rotation = 250; //Скорость пповорота персонажа
public int jump = 3; //Высота прыжка


public static bool IsDrawWeapon; //Двоичная переменная, которая будет отвечать достануто ли у нас оружие.
public static float x = 0.0f; //угол поворота персонажа по оси x
void Start () <
IsDrawWeapon = false; //По умолчанию оружие у нас спрятано.
_speed = speed; //Задаем постоянное стандартное значение скорости персонажа
player = (GameObject)this.gameObject; //Задаем что наш персонаж это объект на котором расположен скрипт
>

void Update () <
if(IsDrawWeapon == true) //Если оружие вытащено
<
speed = _speed * 2; // Меняем скорость передвижени(я это сделал потому что, у этой моделки нету анимаций движения простым шагом с мечом. а понижать скорость анимации у бега получиться не красиво)
if(Input.GetKey(KeyCode.W)) //Если нажать W
<
player.transform.position += player.transform.forward * speed * Time.deltaTime; //Перемещаем персонажа в перед, с заданой скорость. Time.deltaTime ставится для плавного перемещения персонажа, если этого не будет он будет двигаться рывками
>
if(Input.GetKey(KeyCode.S))
<
speed = _speed / 2; //При передвижениии назад снижаем скорость перемещения
player.transform.position -= player.transform.forward * speed * Time.deltaTime; //Перемещаем назад
>
if(Input.GetKeyUp (KeyCode.S))
<
speed = _speed * 2; //Возвращаем cтандартное значение
>
if(Input.GetKey (KeyCode.A))
<
player.transform.position -= player.transform.right * speed * Time.deltaTime; //перемещаем в лево
>
if(Input.GetKey (KeyCode.D))
<
player.transform.position += player.transform.right * speed * Time.deltaTime; //перемещаем в право
>
if(Input.GetKey (KeyCode.Space))
<
player.transform.position += player.transform.up * jump * Time.deltaTime; //Прыгаем
>

if(Input.GetKey (KeyCode.Tab)) //При нажатии и на кнопку Tab
<
IsDrawWeapon = false; //Мы спрячем наше оружие.
>
>
else if(IsDrawWeapon == false) //Если оружие не спрятано. |||||| Сделано разделение на движения в зависимости от того вытащено ли у нас оружие или нет, потому что персонаж будет перемещаться сразной скорость у меня в этих случаях, как я уже написал из за отсутсвия некоторых анимаций у модельки.
<
speed = _speed;//Скорость в стандартное значение
if(Input.GetKey (KeyCode.LeftShift)) //Если зажать левый Shift
<
speed = _speed * 2; //Увеличиваем скорость перемещения(бег)
>
if(Input.GetKeyUp (KeyCode.LeftShift)) //Если отпустить
<
speed = _speed; //Возвращаем стандартное значение
>
if(Input.GetKey(KeyCode.W)) //Если нажать W
<
player.transform.position += player.transform.forward * speed * Time.deltaTime; //Перемещаем персонажа в перед.
>
if(Input.GetKey(KeyCode.S))
<
speed = _speed / 2;
player.transform.position -= player.transform.forward * speed * Time.deltaTime; //Перемещаем назад
>
if(Input.GetKeyUp (KeyCode.S))
<
speed = _speed; //Возвращаем cтандартное значение
>
if(Input.GetKey (KeyCode.A))
<
player.transform.position -= player.transform.right * speed * Time.deltaTime; //перемещаем в лево
>
if(Input.GetKey (KeyCode.D))
<
player.transform.position += player.transform.right * speed * Time.deltaTime; //перемещаем в право
>
if(Input.GetKey (KeyCode.Space))
<
player.transform.position += player.transform.up * jump * Time.deltaTime; //Прыгаем
>
if(Input.GetKey (KeyCode.Tab)) //при нажатии на кнопку таб
<
IsDrawWeapon = true; //Мы вытащим наше оружие
>
>

//Поворачиваем персонажа. Так как наша переменная x глобальна, из скрипта камеры в неё будем записывать длину на сколько сместился указатель мыши и по оси X и относительно этого будет повернут наш персонаж
Quaternion rotate = Quaternion.Euler (0,x,0); //Создаем новую переменную типа Quaternion для задавания угла поворота
player.transform.rotation = rotate; //Поворачиваем персонаж

codeusing UnityEngine;
using System.Collections;

public class CamMove : MonoBehaviour <
public Transform target; //Объект за которым летаем(Наш персонаж)
public float distance = 3.0f; //На каком ратоянии от него
public float xSpeed = 125.0f; //Чуствительность по Х
public float ySpeed = 50.0f; //Y Чуствительность
public float targetHeight = 2.0f; //Высота относительно объекта
//Минимальный и максимальный угол поворота Y инче камеру разверет, Дальше у нас будет простая функция для инвертации их в обратные числа
public float yMinLimit = -40;
public float yMaxLimit = 80;
//Максимальное удаление и приближение камеры к персонажу, искорость.
public float maxDistance = 10.0f;
public float minDistance = 0.5f;
public float zoomRote = 90.0f;

private float x = 0.0f; //Угол поворота по Y?
private float y = 0.0f; //Уго поворота по X?

[AddComponentMenu("Scripts/Mouse Orbit")] //Добавляем в меню

public void Start() <
//переворачивам углы
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;

if(rigidbody)
rigidbody.freezeRotation = true; //Если камера столкнется с физ.объектомона остановиться
>

public void LateUpdate() <
if (target) //Меняем углы согласно положению мыши
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
//Меняем дистанция до персонажа.
distance -= (Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime) * zoomRote * Mathf.Abs(distance);
distance = Mathf.Clamp (distance, minDistance, maxDistance);

y = ClampAngle(y,yMinLimit, yMaxLimit); //Вызыв самописной функции для ограничения углов поврот
movePlayer.x = x;
//Повернуть камеру согласно поченым данным
Quaternion rotation = Quaternion.Euler(y, x, 0);
transform.rotation = rotation;

//Двигаем камеру и следим за персонажем
Vector3 position = rotation * new Vector3(0.0f, targetHeight+0.5f, -distance) + target.position;
transform.position = position;

//Следуйщи код нужен что бы камера не проваливалась по ланшафт
RaycastHit hit;
Vector3 trueTargetPosition = target.transform.position - new Vector3(0, -targetHeight,0);
if(Physics.Linecast (trueTargetPosition, transform.position, out hit))
<
float tempDistance = Vector3.Distance (trueTargetPosition, hit.point) - 0.28f;
position = target.position - (rotation * Vector3.forward * tempDistance + new Vector3(0, -targetHeight, 0));
transform.position = position;
>
>

>
//Меняем значения углов
public static float ClampAngle (float angle, float min, float max) <
if(angle 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
>
>

using UnityEngine;
using System.Collections;

public class AnimatePlayer : MonoBehaviour

public void Start ()
<
// Устанавливаем все клипы анимации в режим цикла
animation.wrapMode = WrapMode.Loop;
// Кроме следующих
animation["Attack01"].wrapMode = WrapMode.Once;
animation["jump"].wrapMode = WrapMode.Once;
animation["Skill"].wrapMode = WrapMode.Once;
//У них одиночное выполнение

//Останавливаем выполнение анимаций.
animation.Stop();
>

public void Update () <
// На основе нажатой клавиши выполняем анимацию
if(movePlayer.IsDrawWeapon == false) //Если оружие не вытащено
<
if (Input.GetAxis("Vertical") > 0.0f) //Проверяем на изминениея позиции персонажа повертикали, если да
<
if(movePlayer.speed == movePlayer._speed * 2) //Проверяем скорость Передвижения персонажа,
<
animation.CrossFade ("Run00"); //Если зажата клавиша shift, значит грузим анимацию бега
>
else
<
animation.CrossFade("Walk"); //В противном случаее ходьбу
>
>
else if(Input.GetAxis("Vertical") 0.0f)
<
if(movePlayer.speed == movePlayer._speed * 2)
<
animation.CrossFade ("R_Run00"); //бег в право
>
else
<
animation.CrossFade ("R_Walk"); //Шагание в право
>

0

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

Игровой форум GFAQ.ru


Разработка компьютерных игр. С чего начать? Это просто! С нуля до разработчика игр: как начать создавать свою игру. Заказать создание игры.

if (directionInput 0 && FacingRight)
<
Flip();
>
>
public void Move(int ImputAxis)
<
directionInput = ImputAxis;
>
void Flip()
<
FacingRight = !FacingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
>
>

V Ξ G Θ N

Спасибо! Помогла, парился более 2-х часов) И наконец, нашел тебя.

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


Не так давно в Unity зарелизили новую систему управления, а значит самое время посмотреть на неё поближе.

Unity не только активно развивающийся, но и очень активно изменяющийся продукт. Замена рендер пайплайнов, UIElements, New Input System - всё это изменения последнего времени, которые призваны сделать движок ещё более быстрым, гибким и дружелюбным. История знает много примеров, когда компании предпринимали рефакторинг больших систем внутри своих продуктов, результатом таких изменений становились как новые успехи в их развитии, так и крах. Отбросив печальные размышления на эту тему, посмотрим, чем же новая система отличается от старой.

На смене поколений

Новая система управления это довольно заметное событие в мире Unity, комьюнити встретило её с очень большим энтузиазмом, обычно приговаривая, что текущая версия не очень удобна. Да и сама компания изготовитель разделяет это мнение и заявляет, что старая система была разработана до добавления большого количества поддерживаемых устройств и не очень была на них рассчитана. В результате интернет содержит довольно большое количество обзоров, которые обычно показывают настройку базового окна нового Action Asset, его сразу можно узнать по трём большим, горизонтально расположенным, блокам настроек. Мы же попробуем пойти в обратном направлении и сначала разберёмся в базовых элементах новой системы, а от них перейдём к более высокоуровневым.

Документация

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

Установка

Package Manager

Так как пакет с новой системой управления вышел в релиз его легко найти в Package Manager поиском по названию Input System .

Warning

Во время установки вас уведомят о том, что у вас выключен native platforms backend и ничего не будет работать, пока вы не переключитесь на него, потеряв при этом доступ к текущему API.

Settings

Не очень понятно зачем они так пугают неокрепшие умы, так как в настройках Edit > Project settings… > Player > Other Settings > Active Input Handling* есть возможность включить сразу оба. Так что не очень важно как вы ответите на вопрос про отключение, вы можете сразу переключить backend в любое подходящее вам значение. =)

Встроенные примеры

Samples

После установки пакета появится доступ к приличному набору примеров по использованию новой системы, который содержит всё необходимое начиная от простых примеров и заканчивая добавлением управления на экран смартфона или перенастройки управления в рантайме.

Архитектура

Система настолько широка, что все её настройки рассмотреть довольно проблематично, да и не нужно, документация покрывает все необходимые для начала моменты.

Если же описать архитектуру в двух словах, то она состоит из 3х уровней:

  • Нативный бэкэнд - предоставляется текущей платформой и фактически не является частью новой системы ввода
  • Низкоуровневый слой - обменивается с бэкэндом информацией в виде эвентов и необработанных данных и сильно заточен на оптимизацию работы с памятью и производительность
  • Высокоуровневый слой - представляет низкоуровневые данные в удобном для настройки и использования виде

Отдельно стоит отметить, что новая система полностью построена на эвентах и всячески подталкивает к их использованию.

Input.GetMouseButtonDown(0)

Думаю, что не многие настраивают управление в начале разработки или при тестировании очередной механики, поэтому первым делом хотелось бы узнать, как отловить обычный клик мышки из кода. В новой системе вызов Input.GetMouseButtonDown(0) превратился в Mouse.current.leftButton.wasPressedThisFrame , как можно заметить количество символов немного увеличилось, с другой стороны, теперь можно не вспоминать, под каким индексом идёт левая кнопка, а если автодополнение в вашей IDE понимает чего вы хотите, то разница будет совсем незначительной. Такой же подход используется для доступа к клавиатуре, например, отпускание кнопки пробел на клавиатуре Keyboard.current.spaceKey.wasReleasedThisFrame .

InputAction

Использование прямого доступа к кнопкам не является основным методом работы с новой системой. Базовым понятием в ней являются объекты типа InputAction, по сути, это абстракция над источниками событий(кнопки, стики и т.п.), которая предоставляет данные об их состоянии(нажата ли кнопка или направление стика) и с помощью эвентов оповещает об их изменении. Лучше всего относиться к ним как к логическим элементам(прыжок или выстрел) и не привязываться к физическим свойствам, таким как нажатие кнопки.

Input action

Пример вида, добавленного в компонент InputAction:

Action Settings

Настройка InputAction предоставляет выбор таких параметров:

Action Type может быть трёх типов:

  • Value - стандартный тип, используется для любого типа ввода, постоянно отслеживающий состояние устройств
  • Button - отличается от Value тем, что может быть связан только с кнопками и используется для отслеживания изменения состояния
  • Pass-Through - в отличие от других типов не используют схему started-performed-canceled(основные типы эвентов) и фактически всегда находится в состоянии performed, его удобно использовать в случае необходимости обработки всех данных с нескольких источников событий

Control Type - описывает тип данных предоставляемых устройством, например, в случае со стиком можно получить данные в виде структуры Vector2.

Interactions - предоставляют возможность настройки специфических действий, допустим, долгого нажатия или мультиклика.

Processors - добавляют постобработку данных поступающих от контроллера перед выдачей их логике, например, нормализацию вектора направления стика на контроллере.

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

Bindings

Также предоставляется доступ к нескольким композитным устройствам, например, направление движения можно получить в виде вектора, получаемого при помощи четырёх кнопок(WSAD или другой комбинации). Набор композитных устройств можно дополнить при необходимости своими, подробнее об этом можно прочитать в документации.

Использование InputAction не требует каких-то дополнительных сущностей и вполне подходит для использования в компонентах, только не стоит забывать, что при создании они находятся в выключенном состоянии и требуют отдельного включения через вызов метода Enable() .

Action Maps

Это объединение нескольких InputAction, которое отвечает за разные наборы действий в игре. Допустим, в меню, с помощью стика на контроллере, вы перемещаетесь между разными кнопками интерфейса, а в игре стик отвечает за перемещение персонажа.

Control Schema

Это абстракция над InputAction которая позволяет задавать разные триггеры для этих самых действий в зависимости от используемых физических устройств. Допустим, управление передвижением с клавиатуры осуществляется через WSAD, а с контроллера через левый стик.

Action Asset

Action Asset

Это новый тип ассета, который отвечает за комплексную настройку InputAction, ActionMap и схем управления, именно его можно встретить в виде большой панели из трёх блоков в большинстве других обзоров.

Итого

Фактически вся новая система вертится вокруг наборов InputAction, а всё остальное призвано структурировать работу с ними. В результате можно выделить четыре основных подхода к использованию новой системы:

  • Обращение к данным устройства напрямую - как в случае с Mouse.current.leftButton.wasPressedThisFrame
  • Использование базовых InputAction
  • Генерация класса с набором InputAction из Action Asset, что сильно упрощает настройку сложных систем управления, использующих разные схемы
  • Использование Action Asset через объект PlayerInput

Как можно заметить Action Asset вовсе не является необходимым условием для настройки управления и служит лишь для упрощения работы с действительно большими и сложными решениями.

Изменение управления

В предыдущей статье мы рассматривали шаблон “Команда”, который обычно используют для добавления возможности перенастройки управления в игре. Использование этого подхода в новой системе фактически добавит лишний слой абстракции над InputAction, так как они уже являются логическими элементами. В свою очередь, изменение управления становится не очень очевидным и реализуется через класс с подозрительным названием InputActionRebindingExtensions. По этой теме есть отдельный пункт в документации и довольно сложный пример под названием Rebinding UI, который поставляется с пакетом. Так как это очень важный элемент для системы управления, то мы рассмотрим его минималистичную реализацию ниже.

Практика

Примеры с полноценным созданием Action Asset довольно часто встречаются на просторах интернета и не имеет смысла повторять их ещё раз, так что, в качестве минималистичного примера, изменим управление магом из наших предыдущих статей на использование новой системы с применением InputAction, а также добавим возможность перенастройки управления.

Реализация

Input Handler

Для базового использования InputActions не требуется какой-либо дополнительной настройки кроме добавления кнопок

Action Settings

Результат

Для первого запуска заклинания используется левая кнопка мышки, а второй выстрел происходит после перенастройки действия на кнопку клавиатуры f

Заключение

Изначально работа с новой системой вызывает ассоциации с добавлением кастомного редактора на какой-нибудь компонент, как, например, в нашей статье о редакторе цветов для генератора Шума Перлина. Но понимание что это очень большое изменение текущего подхода и переход на совершенно новое api приходит очень быстро. Большой набор возможностей и новых компонентов может отпугнуть, но довольно неплохая для первой версии документация и примеры позволяют надеяться на быстрое погружение для её полноценного использования, если, конечно, текущие ограничения не являются для вас большой преградой. Надеюсь, эта статья немного прояснила для вас основы работы с New Input System. Пока! =)

В видео используются интерфейсы IPointerDownHandler (нажатие), IDragHandler (перемещение), IPointerUpHandler .

В этом видео я покажу как сделать управление для 2D игры на андроид. Мы рассмотрим разные виды джойстиков, кнопки, .

Кроме этого мы решим проблему множественных нажатий, при которой нажатие несколькими пальцами на тачпад может .

Всем привет! Я решил переснять видео которое я выложил уже очень давно. Я решил его переснять из-за того что то .

Привет! В этом видео я покажу как сделать управление 3d персонажем с помощью джойстика и управление камерой с .

Программа: 1. Обзор встроенного функционала Unity3D для работы с касаниями. 2. Обработка глобальных и локальных .

Сенсорное управление на андроид Unreal Engine 4/Swipe Gesture Controls В этом видео мы покажем вам, как вы можете .

В этом видео я покажу тебе как добавить Джойстик для 3D персонажа | Unity, Mobile, Joystick. С помощью этого джойстика .

Читайте также: