Основы создания 2D персонажа в Unity 3D 4.3. Часть 2: бегущий персонаж
Всем привет. Продолжаем дело, начатое в первой части. Сейчас у нас есть платформа и стоящий на ней персонаж с анимацией покоя. Настало время научить нашего персонажа бегать вправо-влево по платформе.
Загрузим сцену из первой части. Напомню, что в прошлый раз мы импортировали несколько спрайтов в папку Assets — Sprites. На всякий случай, внизу поста еще раз приведу ссылку на спрайты. Среди них должен быть спрайт под названием Run. Мы будем использовать его для создания анимации бега. Для этого нам надо проделать те же действия по превращению одиночного спрайта в коллекцию, как и при создании анимации покоя. Вкратце напомню: выделяем спрайт, в окне Inspector устанавливаем свойство Sprite Mode как Multiple, нажимаем ниже Sprite Editor, нарезаем изображение в режиме Grid или Automatic.
Теперь в окне Hierarchy выбираем Character и переходим в окно Animation. Нажимаем на поле с анимацией Idle и выбираем Create New Clip, чтобы создать анимацию бега. Сохраним файл анимации в папке Assets — Animations под именем Run.

Новая созданная анимация Run стала текущей в окне Animation. Разворачиваем спрайт Run в окне Project, выделяем все фалы Run_0… Run_9 и перетаскиваем в окно Animation. Установим пока значение Sample равное 24.

Все это мы уже делали в первой части, а теперь будет нечто новое. Перейдем в окно Animator. Сейчас там отображены три анимации: Any State, Idle и Run. Нам предстоит задать условия перехода из анимации Idle в анимацию Run, то есть из состояния покоя в состояние бега. В нижнем левом углу есть поле Parameters. Нажимаем на плюсик, выбираем Float и называем новый параметр как Speed. Тем самым мы создали параметр типа число с плавающей запятой, обозначающий скорость перемещения персонажа. Именно в зависимости от значения этого параметра будет происходить переключение из анимации покоя в анимацию бега. Теперь нажимаем правой кнопкой мыши на анимацию Idle, выбираем Make Transition и нажимаем левой кнопкой мыши на анимацию Run. Между анимациями появится линия со стрелкой. Передвиньте мышкой прямоугольники анимации, если плохо видно. Кликнем по линии со стрелкой. В окне Inspector отобразятся свойства перехода между анимациями. Обратим внимание на низ окна, в раздел Conditions. Кликнем на параметр Exit Time и поменяем его на Speed. Второе поле Greater оставим без изменений, а в третьем введем значение 0.01. Мы создали условие перехода из анимации покоя в анимацию бега — оно происходит, когда значение параметра скорости становится немногим больше нуля.

Теперь нужно сделать обратный переход — из Run в Idle. Делаем все с точностью наоборот: Make Transition от Run к Idle, выделяем переход, в Conditions устанавливаем Speed — Less — 0.01.

Теперь у нас есть две анимации и условия перехода между ними. Но пока ничего работать не будет, потому что все что мы сделали нужно «оживить» при помощи скрипта. Давайте перейдем в окно Project и создадим в папке Assets подпапку Scripts. Добавим в нее новый C# Script, назовем его CharacterControllerScript и откроем на редактирование.

Я приведу полный листинг скрипта с подробными комментариями, а ниже еще поясню, что в нем происходит.
Итак, мы завели несколько переменных: для задания максимальной скорости перемещения, для определения направления (вправо/влево) и для работы с компонентом Animator. Почти все действия происходят в методе FixedUpdate. В нем мы получаем значение оси Х, которое меняется при нажатии на клавиатуре клавиш влево-вправо или A-D (если не меняли соответствующие настройки проекта!). Затем устанавливаем это значение параметру Speed компонента Animator. Обратите внимание, что мы берем модуль этого значения при помощи метода Mathf.Abs, так как при создании условий перехода между анимациями покоя и бега мы сравниваем значение параметра с положительным числом 0.01. Нам здесь не важно, в какую сторону бежит персонаж. Важно лишь величина значения. Далее задаем скорость перемещения по оси Х в соответствии со значением максимальной скорости. И, наконец, проверяем, в какую сторону бежит персонаж, и в какую сторону он в этот момент повернут. Если он бежит вправо, а повернут влево — разворачиваем его вправо путем инвертирования его размера по оси Х. И наоборот. Этим нехитрым способом мы избавились от необходимости делать две анимации вместо одной: для бега вправо и для бега влево.
Сохраняем скрипт. В Unity перетаскиваем его на нашего Character в окне Hierarchy. Запускаем игру, нажимаем влево-вправо или A-D.

Капитан Коготь теперь умеет бегать! Скорость анимации получилась быстроватой. Ее можно снизить путем уменьшения значения Sample в окне Animation для анимации Run (значение 12 будет нормально). Если одновременно с игрой у вас видно окно Animator, то вы увидите, что во время покоя работает анимация Idle (бегает синий прогрессбар), а во время бега происходит переход на анимацию Run, и, соответственно, работает она.
На этом пока все. Нам осталось разобраться с прыжками… и узнать при этом еще несколько новых вещей!
Ссылка на спрайты.
What is Unity?
I started this from the worst way that someone can start a document. Everyone knows Unity 3D is a Game Development platform.
Unity is a cross-platform game engine developed by Unity Technologies, first announced and released in June 2005 at Apple Inc.’s Worldwide Developers Conference as a Mac OS X-exclusive game engine. As of 2018, the engine had been extended to support more than 25 platforms. The engine can be used to create three-dimensional, two-dimensional, virtual reality, and augmented reality games, as well as simulations and other experiences. The engine has been adopted by industries outside video gaming, such as film, automotive, architecture, engineering and construction.
Several major versions of Unity have been released since its launch. The latest stable version, 2019.3.10, was released in April 2020 as Wiki says.
Anyone can Download unity by visiting https://unity3d.com/get-unity/download this URL and have the newest version of it.
After Fundamentals,
To see the way how a 2D player movement scripting must be done, We have to start a new 2D project.
After starting a new project, (Unity will get some time to load) then we have to import our 2D model to the Unity screen. This time I am using a default Sprite provided by unity. We can do this by right clicking on the Hierarchy window and selecting new 2d object.
Then it will be on our Scene layout and I did some adjustments like changing the size and color, Changing the Sprite shape to a Cube, like that..
Then We have to add 2 main components to make sure everything works fine after. Those two are Rigidbody 2D and Box Collider 2D. On the inspector window/panel there is a button called Add Components. Click on that and we can select those two attributes to our main Character(square)
What is Rigidbody 2D ?
A Rigidbody 2D component places an object under the control of the physics engine. Many concepts familiar from the standard Rigidbody component carry over to Rigidbody 2D; the differences are that in 2D, objects can only move in the XY plane and can only rotate on an axis perpendicular to that plane. Adding a Rigidbody 2D allows a sprite to move in a physically convincing way by applying forces from the scripting API. When the appropriate collider component is also attached to the sprite Game Object, it is affected by collisions with other moving Game Objects. Using physics simplifies many common game play mechanics and allows for realistic behavior with minimal coding.
Передвижение персонажа в Unity 2D и 3D

Приветствую! В данной статье мы разберём правильную реализацию движения персонажа. Поскольку движение 2D и 3D персонажей почти на 100% эдентичны, то мы поочереди их и разберём. Благодаря чему, начинающий разработчик не только разберётся в том, как реализовать функцию передвижения, но увидит разницу между движениями 2D и 3D.
Начнём свой пусть с 2D передвижения, поскольку он чуток легче в понимании.
Передвижение 2D персонажа
Первым делом создадим игровой объект нашего персонажа, и назовём его, например, Player.

Далее добавим к нашему персонажу компонент Rigidbody 2D. Если в Вашей игре отсутствуют законы гравитации, то в в поле Body Type необходимо указать значение "Kinematic".
P.S. Обычно гравитация отсутствует в 2д играх с видом сверху.

Теперь самое интересное, нам необходимо создать C# скрипт с названием, например movePlayer, и присвоить этот скрипт нашему объекту Player. А сам скрипт должен иметь следующее содержимое:
Готово! Давайте разберём наш код. В строках 7,8,9 мы создали 3 переменные:
- rb — которая будет хранить ссылку на компонент Rigidbody2D
- speed — скорость передвижения вашего персонажа
- moveVector — направление движения персонажа в виде вектора
Далее в 13 строке мы в переменную rb присваивает ссылку на наш компонент Rigidbody2D, чтобы в дальнейшем можно было бы работать с его свойствами и методами.
В строке 18 в переменную moveVector.x мы записываем значение движения по горизонтали. Если максимально простыми словами, то при нажатии на клавишу "D", в переменной записывается значение "1" — вперёд. При нажатии на клавишу "A" — в переменную записывается "-1" — назад.
Аналогичная ситуация происходит и в 19 строке. При нажатии на клавишу "W", в переменной записывается значение "1" — вверх. При нажатии на клавишу "S" — в переменную записывается "-1" — вниз.
Ну и в 20 строке, с помощью метода MovePosition, мы заставляем двигаться нашего персонажа, исходя из значений которые мы получили в moveVector.
Теперь Ваш персонаж может спокойно передвигаться в мировом пространстве. Как видите, всё очень просто и понятно. Теперь как и обещал, перейдём к 3D.
Передвижение 3D персонажа
Для начала, создадим игровой объект персонажа с названием, например, Player. А так же создадим объект Земли, по которой персонаж будет передвигаться. И назовём его, например, Ground.

Так же добавляем к персонажу компонент Rigidbody — чтобы на него действовала гравитация(если нужно).
Теперь так же необходимо создать C# скрипт с названием, например movePlayer, и присваиваем этот скрипт нашему объекту Player. А сам скрипт должен иметь следующее содержимое:
Как видите, данный код почти на 100% аналогичен. Давайте посмотрим, что мы тут изменили.
- В 7 и 13 строке мы измении тип компонента с Rigidbody2d на Rigidbody, ведь мы уже имеем дело не с 2д, а с 3д.
- В 9 строке тип переменной moveVector изменён с Vector2 на Vector3, так как у игр 3D, три мировые оси а не две.
- В 19 строке мы изменили moveVector.y на moveVector.z, поскольку в 3D играх, ось по Y отвечает за верх. А вверх идти нельзя. Вверх можно передвигаться только с помощью прыжка, который мы реализуем в следующей статье.
На этом всё. Надеюсь данная статья научила Вас реализации передвижения персонажа, а так же показала в чём принципиальная разница передвижений между 2D и 3D играми.
Как научить робота ходить или процедурная анимация в Unity
Процедурность в играх встречается повсеместно: анимации, предметы, персонажи, уровни, целые миры — всё это можно сделать с помощью кода. В одних проектах процедурность — небольшая деталь, а в других — ключевая особенность. Небольшой команде или игроделу-одиночке процедурность может упростить разработку проекта или стать для этого проекта частью творческой задумки.
В этой статье я буду рассматривать процедурные анимации и как реализовать их в Unity на примере передвижения робота.
В основне процедурных анимаций лежит инверсная кинематика. Задачей инверсной кинематики является поиск такого набора конфигураций сочленений, который обеспечил бы максимально мягкое, быстрое и точное движение к заданным точкам. Проще говоря инверсионная кинематика решает вопрос, как передвинуть цепь связанных костей, чтобы это было плавно и красиво. В конце статьи я оставлю ссылки для более подробного ознакомления с этой темой.
В Unity есть дополнительный пакет Animation Rigging, в котором есть реализация IK.
Когда мы установили этот пакет, начинаем подключать инверсионную кинематику к нашему роботу.
Теперь мы должны добавить компоненты Bone Renderer и Rig Builder к контейнеру, содержащему кости робота.
У нас добавился объект Rig 1, в нем мы будем добавлять инверсионную кинематику для наших костей, переименую его в FootRig.
Далее в нем создаем пустые объекты на каждую ногу робота.
Когда мы это сделали, добавим к новосозданным объектам компонент Two Bone IK Constraint.
С описанием каждого компонента Animation Rigging можно ознакомиться в официальной документации Unity, но если коротко, с помощью Two Bone IK Constraint мы создаем конечность, которой мы задаем цель и ограничители, чтобы при перемещении к заданной точке она вела себя как реальная кость, не деформируясь.
В поля Root/Mid/Top нужно перенести кости нашего робота:
- Root — главная кость ноги.
- Mid — что-то вроде колена.
- Top — кончик лапы. Важно, чтобы это был кончик, а не сама кость, так как именно кончик должен стремиться к заданной цели.
Теперь, для нашей конечности нужно создать таргеты — точки, к которым будет стремиться лапка нашего робота. Мы сделаем их вне объекта робота, так как они не должны зависеть от его расположения, но, чтобы не потерять, создадим контейнер для хранения робота и таргетов.
Также, для инверсионной кинематики лапок нашего робота можно добавить Hints. Они используются для указания направления, в котором конечность должна быть повернута. Этот компонент необязателен, но для робота я лучше их задам. Так как они лишь задают, как конечность должна быть повернута или наклонена, хинты можно добавить в контейнер FootRig. Далее перекидываем их в соответствующее поле на Two Bone IK Constraint, как мы это сделали с таргетами.