Input.GetAxis
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
Submission failed
For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
Declaration
Description
Returns the value of the virtual axis identified by axisName .
The value will be in the range -1. 1 for keyboard and joystick input devices.
The meaning of this value depends on the type of input control, for example with a joystick’s horizontal axis a value of 1 means the stick is pushed all the way to the right and a value of -1 means it’s all the way to the left; a value of 0 means the joystick is in its neutral position.
If the axis is mapped to the mouse, the value is different and will not be in the range of -1. 1. Instead it’ll be the current mouse delta multiplied by the axis sensitivity. Typically a positive value means the mouse is moving right/down and a negative value means the mouse is moving left/up.
This is frame-rate independent; you do not need to be concerned about varying frame-rates when using this value.
To set up your input or view the options for axisName , go to Edit > Project Settings > Input Manager. This brings up the Input Manager. Expand Axis to see the list of your current inputs. You can use one of these as the axisName . To rename the input or change the positive button etc., expand one of the options, and change the name in the Name field or Positive Button field. Also, change the Type to Joystick Axis. To add a new input, add 1 to the number in the Size field.
Note: The Horizontal and Vertical ranges change from 0 to +1 or -1 with increase/decrease in 0.05f steps. GetAxisRaw has changes from 0 to 1 or -1 immediately, so with no steps.
What parameters can I use with Unity Input.getAxis?
Unity .getAxis(string name) seems to return the thought offset generated by user input (arrows, mouse or even joystick). The return values is conveniently in interval of <-1; 1> except for the mousewheel.
From various code samples I can see many ways of getting input, but there seems to be no actual name/input list. In my case, I want to enable zoom using wheel or PgUp and PgDn . Wheel code looks like this:
But what for page down and page up? And, in general, how can I know which names to use in this method?
1 Answer 1
Input.GetAxis and Input.GetButton (as well as GetButtonDown and GetButtonUp) just return the state of one of the virtual input axis defined in the Input manager.
The return values doesn’t need to be in the range [-1, 1] . Most virtual axes that represent an absolute value are represented by a value between -1 and 1. However there are axes that return relative movement like the the predefined «MouseWheel», «Mouse X» and «Mouse Y». They return the amount that axis has moved since the last frame.
The MouseWheel has some additional «problems». The delta value is taken from the OS. If the user has set the scroll wheel to advance 3 lines per «scroll unit», You will get values of a multiple of 3. If you manage to spin the wheel fast enough you might get values greater than 3 or smaller than -3.
There are no default axes for PageUp or PageDown, however you can add them if you like. But be careful, GetAxis will return the state of the virtual axis. So when you hold down the positive button you will get a «1» as long as you hold the button down. If you want to listen to events you have to use GetButtonDown / GetButtonUp.
However if you want to check a certain key it’s usually simpler to use GetKeyDown / GetKeyUp which takes a KeyCode.
edit
If you want to know the commonly available key names, take a look at the Conventional Game Input page. At the bottom there’s a list of most common keynames including «page up» and «page down». The input manager usually refuses wrong key names. So if you type one in, unfocus to input field and the value stays, it’s correct.
If you set a positive button whenever you press the button down the virtual axis will «slowly» increase from 0 to 1 depending on the «sensitivity» setting. The sensitivity is like an acceleration factor. If you release the button it will return «slowly» back to 0 depending on the «gravity» value which is a deceleration factor.
If you setup a positive and a negative button, the axis can go both ways up to 1 when the positive button is pressed and down to -1 when you press the negative button. If «snap» is true it would snap back to 0 immediately if you press the opposite button instead of slowly going back to 0 and then start growing in the opposite direction.
The «dead» value defines the dead-zone. If the value of an axis is smaller than dead (or greatern than -dead) it will be treated as 0. This is important for real analog input devices which usually have some jitter around their resting position.
The remaining properties like «invert», «Type» and so one should be clear when reading the documentation.
It’s possible to define two axis with the same name like the defaule «Horizontal» and «Vertical» axes. Axes with the same name are treated as one.
Unity3d Tank Tutorial: Ходовая часть (Урок 1. Основы механики транспортного средства)
Итак вы уже не новички в Unity, вы умеете создавать сцену, расставлять объекты на сцене, создавать terrain, делать префабы и тд… и главное — работать со скриптами, либо вы уже изучили статьи: Unity3D для начинающих — Туториал 1 и Unity3d script basics. Все эти знания вам пригодятся ведь в этом уроке мы двинемся намного дальше.
А именно: в первой части этого урока вы узнаете что такое Wheel Collider, как с помощью него управлять транспортным средством и создать реалистичное поведение подвески автомобиля, во второй части урока, на основе всего этого я покажу как сделать ходовую часть танка с соответствующей физикой и контроллерами.
Собственно то что вы видите на изображении сверху (это будет результат данного урока) вы можете опробовать «вживую» прямо в браузере. Хотите сделать это сами? Тогда добро пожаловать под кат
Перед тем как начать рассказывать об основах моделирования механики автомобиля на Unity я не могу не отметить что на официальном сайте уже есть уроки на эту тему например здесь. Правда на протяжении всего этого даются лишь указания на то, какой скрипт прикрепить к какому объекту и лишь изредка объясняют чтонибудь полезное, в третьей части урока наконец то объясняют как работает главный скрипт, хотя по моему это надо было делать в самой первой части, и начинать объяснять с того момента как работают wheel collider’ы и как они взаимодействуют с rigidbody, в итоге я сделал вывод что данный урок не рассчитан на новичков в Unity и хочу это исправить.
Но если вы уже знаете что такое Wheel Collider и с чем его едят, то вы можете пропустить этот урок.
1. Создаем «Автомобиль»
Для начала проделайте стандартные процедуры, создайте сцену, создайте terrain, либо используйте уже готовые, затем создайте пустой Game Object(GO), (GameObject->Create Empty), назовем его какнибудь оригинально, например Car.
Затем создайте куб (GameObject->Create Other -> Cube) примените к нему какой нибудь материал из стандартных, чтобы его было лучше видно. Представим себе что это кузов нашего автомобиля, и растянем его с помощью Scale по ширине и длине так чтобы передняя часть этого кузова смотрела вдоль оси Z (синяя ось, именно она официально считается передом в мире Unity) затем перетянем наш Cube на объект Car во вкладке Hierarchy, чтобы он стал дочерним объекту Car. Перейдем на сам объект Car и добавим ему Rigidbody (Component -> Physics -> Rigidbody). Назначим ему соответствующий вес, примерно 1500 кг., кузов автомобиля готов.
Помимо кузова у автомобиля должны быть колеса, теперь создайте цилиндр (GameObject->Create Other -> Cylinder), используйте все тот же Scale, придайте ему вид колеса, затем разверните его по оси Z на 90 градусов (важно! Только по оси Z!).
Переименуем наш только что созданный цилиндр в Wheel Forward Left, установим колесо на свое место, тоесть спереди и слева от нашего куба, (повторяю, передом в Unity считается положительная чать оси Z).
Перетянем Wheel Forward Left на объект Car. Назначим колесу текстуру по детальнее чтобы лучше видеть вращение колеса. Теперь скопируем наше колесо (Правой кнопкой по Wheel Forward Left и Duplicate), назовем Wheel Back Left и поставим на законное место, по аналогии поступите с остальными двумя колесами.
Итак, наш суперкар почти готов! Поднимите его немного над поверхностью terrain’а и нажмите Play, автомобиль упадет на землю и встанет колом на колеса, о мягкой подвеске ему еще только мечтать, выходите из Play mode. Как видите у наших колес имеется компонент под названием Capsule Collider, а у кузова Box Collider, я не буду рассказывать в этом уроке что такое коллизии и как на основе них рассчитать положение объекта в пространстве, объясню проще: если у объекта имеется какой – либо из простых collider’ов (Box, Capsule, Mesh,…) то этот объект может взаимодействовать с другими объектами содержащими Rigidbody и один или несколько collider’ов, в свою очередь объект содержащий Rigidbody будет вычислять свою позицию на основе столкновений всех подчиненных ему collider’ов и назначенных им физических материалов.
Если вы из вышесказанного не поняли ничего, не заморачивайтесь, понимание придет с практикой.
А пока что выберите каждое из наших колес и удалите у них Capsule Collider (Правой кнопкой по нему и Remove Component). Нажмите Play, теперь автомобиль больше не стоит на колесах, они прошли сквозь террейн и взаимодействует с поверхностью у нас теперь только кузов.
2. Добавляем Wheel Colliders
Итак что же такое этот загадочный Wheel Collider? Давайте разбираться. Создайте пустой GameObject назовите его WCollider Forward Left, теперь добавьте к нему компонент Wheel Collider (Component -> Physics -> Wheel Collider), он выглядит как окружность с отрезком внутри, он может быть слишком большим или слишком маленьким по сравнению с вашим колесом, все зависит от того насколько вы увлеклись использованием scale. К счастью у него есть параметр Radius, изменяя данный параметр подгоните его под радиус своего колеса, затем создайте новый префаб (Assets -> Create -> Prefab) назовите его WCollider затем перетяните WCollider Forward Left на префаб. Мы создали префаб для удобства, так как коллайдеров у нас будет столько же сколько колес, и чтобы не изменять параметры каждого, будем изменять параметры префаба, остальные коллайдеры унаследуют его свойства. Теперь делаем стандартную процедуру, перетаскиваем WCollider Forward Left на объект Car и помещаем в центр переднего левого колеса, дублируйте его 3 раза переименуйте и переместите в соответствии с другими колесами.
Нажмите Play, автомобиль упадет и опять встанет на колеса (кстати если колеса все равно проходят сквозь террейн, это значит что автомобиль падает на землю с очень большой скоростью, и вам просто напросто нужно уменьшить расстояние до земли, либо увеличите параметр Drag у Rigidbody). Как видите результат не сильно отличается от того где у нас на колёсах стояли Capsule Colliders, все правильно, потому, что мы не задали нашим Wheel Collider’ам никаких параметров.
- Suspension Distanse – по сути это длина пружины нашей подвески, ставим 0.15
- Suspension Spring -> Spring – жесткость подвески, чем больше вес нашего Rigidbody, тем больше должна быть жесткость, ставим 9000
- Suspension Spring -> Damper – Смягчитель подвески, большее значение заставляет пружину двигаться медленнее, ставим 100
- Mass – масса колеса, оставляем 1
- Forward Friction – «передняя» сила трения колеса, оставляем как есть
- Sideways Friction – «боковая» сила трения колеса, полезно если хотим реализовать дрифт автомобиля, оставляем как есть
Итак, нажмите Play сейчас, посмотрите, наш автомобиль ведет себя теперь совсем по другому, теперь он пружинит от поверхности террейна, а если вы поставите его на склон какой нибудь горки, он покатится с неё, вот так у нас работают Wheel Collider’ы.
Но это далеко не все на что они способны, давайте выясним как с помощью них управлять автомобилем и сделать так чтобы наши колеса крутились и реагировали на неровности ландшафта. Начинаем скриптовать!
3. Управляем Wheel Collider’ами
В этом уроке я буду писать скрипты на C#, простите меня JavaScript’еры, он мне привычнее, я думаю вы разберетесь.
Создаем новый С# скрипт (Assets -> Create -> C Sharp Script), назовем его CarController, открываем и напишем следующее:
- Главный класс скрипта должен называться точно так же как и файл скрипта, иначе компилятор выдаст ошибку.
- Массив передних коллайдеров.
- Массив задних коллайдеров.
- Будем использовать функцию Start() для инициализации.
- Как то в уроке Unity3d script basics я говорил что для физического взаимодействия с объектами лучше использовать функцию FixedUpdate(), нежели функцию Update().
Далее работаем с нашими коллайдерами, дополняем скрипт:
Теперь можете нажать Play, и используя кнопки W,S или стрелки вперед — назад, привести в движение нашу «формулу один», а кнопками A,D, или стрелками влево – вправо, поворачивать.
- Максимальный угол поворота колес.
- Максимальный крутящий момент передающийся на колесо.
- Максимальный тормозной момент.
- Функция GetAxis() класса Input ждет события которое возникает когда мы нажимаем на клавиши движения на контроллере, либо двигаем стики джойстика, функция принимает направление виртуальной оси, (например «Vertical» – это клавиши W,S, либо движение джойстика вперед – назад) и возвращает число от -1 до 1, где -1 – движение назад либо влево, (клавиша S в «Vertical» оси, D в «Horizontal») 0 – оси не активны и 1 – движение вперед, либо вправо (клавиша W в «Vertical» оси, A в «Horizontal», либо движение стика джойстика влево — вправо).
- Передаем результаты полученные от виртуальных осей в функцию CarMove().
- Для каждого Wheel Collider’а находящегося в массиве WColForward мы изменяем переменную steerAngle, (угол поворота колеса) умножая её на значение полученное с горизонтальной оси.
- Если вертикальная ось у нас в положении покоя (тоесть если мы не давим на клавиши W или S) то изменяем переменную коллайдера brakeTorque, которая отвечает за силу торможения, это нужно для того чтобы автомобиль не двигался по инерции если мы не нажимаем на клавиши движения.
- В других случаях, (если мы нажимаем на клавиши W или S) обнуляем силу торможения, а затем изменяем переменную motorTorque, (крутящий момент колеса) умножая её на значение полученное с вертикальной оси, вследствие чего наш автомобиль начинает ускоряться.
Давайте обо всем по порядку.
4. Центр тяжести
Задается он удивительно просто, во первых нам надо создать пустой GO, назовем его Center of mass, затем перетянуть его на объект Car, и разместить его приблизительно там где вы считаете он должен быть, например чтобы моё авто не переворачивалось при повороте на высокой скорости мне пришлось сделать его вот так:
- Объявите переменную: public Transform COM.
- Перетащите GO Center of mass на поле COM в скрипте.
- Внутри функции Start() напишите следующую строчку: rigidbody.centerOfMass = COM.localPosition
5. «Оживляем» колеса
Ну вот мы и добрались до финальной, на мой взгляд самой интересной в этом уроке и в то же время довольно сложной темы.
Для того чтобы оживить колесо, нам необходимо вычислять позицию и угол его вращения в каждом фиксированном кадре, в этом нам опять поможет чудесный WheelCollider, его метод GetGroundHit(), который способен вернуть структуру WheelHit в которой в свою очередь содержится точка соприкосновения коллайдера и террейна (переменная point). Благодаря методу GetGroundHit() мы можем вычислить позицию колеса на основе движения пружины подвески. Ну а что касается угла поворота – это совсем просто, в WheelCollider’е есть float переменная rpm, это аббревиатура от rotation per minute, на её основе мы и можем определить угол вращения колеса.
Переходим собственно к скрипту, он вырос, потолстел и теперь выглядит так:
Скопируйте его, вставьте в свой скрипт, затем во вкладке hierarchy выберите наш объект Car, как вы можете видеть в инспекторе у нас появились новые переменные и массивы в скрипте, в массивы wheelsF и wheelsB необходимо передать передние и задние колеса соответственно, (колеса а не Wheel Collier’ы!) как сделаете это нажмите Play. Если колеса уходят под террейн то поменяйте значение переменной wheelRadius, оно должно примерно совпадать с радиусом ваших коллайдеров.
Итак должно произойти чудо, ваши колеса теперь будут вращаться и реагировать на неровности ландшафта прям как настоящие.
- Создаем массивы которые будут хранить Transform наших колес.
- Данные переменные нам пригодятся, ниже объясню для чего.
- Создадим класс который будет содержать нужную нам информацию о каждом нашем колесе, а именно:
- Transform колеса;
- Wheel Collider Колеса;
- Стартовую позицию колеса;
- Угол вращения колеса.
- Объявляем массив wheels c типом WheelData.
- Передаем в массив wheels необходимые нам данные, для этого я написал функцию SetupWheels().
- Функция SetupWheels() принимает Transform колеса и его WheelCollider, передает в переменные содержащиеся в классе WheelData необходимые нам данные и возвращает его.
- Напишем функцию UpdateWheels() в которой будет вычисляться позиция и угол поворота наших колес.
- Запоминаем переменную fixedDeltaTime класса Time она нужна нам для того чтобы вращение колеса было равномерно растянуто по времени.
- Для каждого элемента массива wheels выполняем следующие операции:
- Создаем переменную класса WheelHit (о ней я рассказывал выше);
- Запоминаем локальную позицию колеса (локальная позиция – это позиция относительно родительских координат, глобальная – относительно мировых);
- Если WheelCollider колеса сталкивается с поверхностью террейна (либо чего нибудь другого);
- То из координаты Y локальной позиции колеса вычитаем Dot() между вектором с началом в точке в которой коллайдер соприкасается с поверхностью террейна (hit.point) и концом в текущей позиции колеса (w.wheelTransform.position) и между вектором направленным вверх относительно объекта Car (transform.up) и из всего этого вычитаем еще и переменную wheelRadius чтобы колесо заняло правильное место. (Если из вышесказанного вы не поняли ни слова, не расстраивайтесь большинство людей не понимает этого с первого раза, для этого вам нужно хорошо знать что такое Dot product и как он связан с перечисленными выше векторами, либо просто знайте что позиция колеса должна вычисляться именно так);
- Если WheelCollider не касается поверхности террейна. То из координаты Y начальной локальной позиции колеса отнимаем wheelOffset, благодаря этому наши колеса не улетают в неизвестном направлении когда автомобиль падает с высоты или лежит на «спине»;
- Применяем измененную позицию колеса к его текущей позиции;
- Вычисляем угол «вращения» колеса, используя функцию Repeat() класса Mathf, данная функция помогает нам держать угол в интервале от 0 до 360 градусов, сам же угол мы вычисляем благодаря не хитрой формуле (w.rotation + delta * w.col.rpm * 360.0f / 60.0f) где мы собственно к текущему углу поворота прибавляем дельту времени умноженную на число поворотов в минуту хранящееся в коллайдере и умноженную на 360/60.
- Применяем к текущим локальным углам поворота получившийся результат, в этом нам помогает функция Euler() класса Quaternion которая возвращает кватернион в Эйлеровых углах (как бы не было страшно слово кватернион я советую вам абстрагироваться и воспринимать его как структуру хранящую локальные и глобальные углы поворота, хотя означает оно совсем другое, здесь я не буду рассказывать что именно, так просто будет понятнее). Первым аргументом (тоесть угол вокруг оси X) мы передаем наш вычисленный угол «вращения» колеса, вторым аргументом (угол вокруг оси Y) мы передаем угол поворота коллайдера, и третьим аргументом (угол по оси Z, теперь понимаете почему в пункте 1 было важно повернуть колеса именно вокруг оси Z) предаем константу 90.0f.
Заключение
Ну вот и все что я могу рассказать про то как построить механику обычного автомобиля на Unity3D, прочитав и осознав все вышесказанное вы можете прямо сейчас отправляться делать гоночный симулятор.
Ну а в следующей части урока я как и обещал расскажу о том как построить механику гусениц танка, также я расскажу о методах его моделирования в 3D редакторе и немного про экспорт модели из него и импорт в Unity ну и естественно я не буду вас заставлять моделировать то что вы видели в данном демо, а предоставлю уже готовую модель. Спасибо за внимание и удачи в изучении Unity3d.
Unity GetAxis vs GetAxisRaw
With any game, the first thing one does is move an object. Sounds simple but to make the movement snappy and smooth takes a little bit of tweaking.
We all know about Input.GetAxis and Input.GetAxisRaw but when to use which?
GetAxis is smoothed based on the “sensitivity” setting so that value gradually changes from 0 to 1, or 0 to -1. Whereas GetAxisRaw will only ever return 0, -1, or 1 exactly (assuming a digital input such as a keyboard or joystick button).
Specific scenarios to use GetAxisRaw? Well, when you don’t want the input to be smoothed but to immediately reflect the actual input. I think it’s more common for 2D games to use raw input and 3D games to have soothing, but that’s purely anecdotal — you just need to choose the method that fits your game.