Найти тему
NoT ZaTroTing

Создаём платформер в Unity2D #3

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

Для этого нам нужен спрайт персонажа. Для себя я выбрал вот такой пак со спрайтами:

Можете хоть треугольник взять, это не важно
Можете хоть треугольник взять, это не важно

Дальше переносим спрайт на сцену, который мы хотим:

Если у Вас не отображается спрайт, увеличьте Order in Layer
Если у Вас не отображается спрайт, увеличьте Order in Layer

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

Размер спрайта и Pixels Per Unit должны совпадать
Размер спрайта и Pixels Per Unit должны совпадать

Теперь нам надо добавить физику нашему персонажу, для этого в окне Инспектора нажимаем Add Component и выбираем RigidBody2D:

-4

Также необходимо добавить само тело. Добавляем Box Collider 2D и нажимаем на значок:

Для большего удобства спрячьте на время "небо"
Для большего удобства спрячьте на время "небо"

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

Теперь же необходимо добавить тело земле, чтобы персонаж не проваливался сквозь неё: добавляем TileMap Collider 2D. Можно заметить, что у земли добавились зелёные линии, а если еще лучше присмотреться, то можно заметить, что эти линии находятся между тайлами, а это нам не нужно. Поэтому мы добавляем ещё Composite Collider 2D, а в TileMap Collider 2D ставим галочку у параметра Used By Composite. И о чудо, как теперь всё прекрасно выглядит!

-6

Теперь можно запустить Игровой режим. Но что мы видим! Наша земля падает. Это случилось из-за автодобавления Rigid Body 2D, просто вместо Dynamic ставим Static. Вуа-ля, земля не падает!

Но нам же хочется управлять персонажем? Для этого надо создать Скрипт. Создаём в корневой папке папку Scripts, открываем её и создаём C# Script, который также открываем:

Стандартный Script-файл
Стандартный Script-файл

Метод Start() исполняется, когда мы запускаем игру, а Update() выполняется каждый кадр.

Давайте проинициализируем переменные fox типа Rigidbody2D и speed типа float:

-8

Теперь нам надо добавить движение нашей Лисе. Для этого в методе Update() (а лучше в FixedUpdate(), т.к. мы взаимодействуем с физическим объектом в скрипте; за уточнение спасибо Василию Курбатову, комментарий которого закреплен под этой статьёй; также уточню, что все взамидойсвтия с физ. объектами, которые будут в следующих уроках следует также добавлять именно в FixedUpdate()) добавим одну сточку:

Строчка-то одна, а сколько делает...
Строчка-то одна, а сколько делает...

Не пугайтесь, сейчас расскажу, что она делает:

  1. fox.velocity - это скорость Лисы, и, как известно, у скорости есть направление, т.е. вектор (new Vector2());
  2. Input.GetAxisRaw() - это первый параметр вектора (X). Он принимает соответствующие нажатия для передвижения вправо/влево;
  3. *speed - это коэффициент скорости, который можем сами задать в интерфейсе Unity;
  4. fox.velocity.y - это координата Y Лисы.

Таким образом, эта строка создаёт вектор, который начинается на координатах Лисы и который направлен влево/вправо.

Теперь необходимо добавить прыжок. Для этого надо отслеживать нажатие клавиши (например Space). Чтобы это делать, надо в методе Update() добавить проверку нажатия:

Коэффициент jump аналогичен speed, только для вертикали
Коэффициент jump аналогичен speed, только для вертикали

В условии мы проверяем на нажатие Space. Если произошло нажатие, то мы Лисе добавляем вектор, направленный вверх.

Но нам не хватает одной детали: проверки на "опору":

-11

В условии мы добавили grounded, т.е. если мы нажали на Space и Лиса на земле, то только тогда будет прыжок. Сам же Grounded только тогда принимает значение true, когда в радиусе находится слой ground.

Чтобы добавить этот слой в Unity выбираем группу тайлов земли и нажимаем в Инспекторе Layer, Add layer (Добавить Слой):

Дальше в свободной ячейке добавьте слой, а затем выберите его для этих тайлов
Дальше в свободной ячейке добавьте слой, а затем выберите его для этих тайлов

Дальше создаём дочерний от нашего персонажа пустой игровой объект и переносим его в ноги. Затем возвращаемся к нашему персонажу.

Jump и Speed ставьте под себя
Jump и Speed ставьте под себя

В Ground Check я добавил пустой объект, а в Ground добавил тот слой, который только что создал.

Остался последний шаг: исправить багу, когда мы находимся слева/справа от тайла и не падаем. Для этого добавляем Physics Material в папку и устанавливаем значения 0 на обоих пунктах. Далее в Box Collider 2D персонажа добавляем этот файл:

Не забудьте поставить в Rigidbody 2D поставить галочку у Freeze Rotation по Z
Не забудьте поставить в Rigidbody 2D поставить галочку у Freeze Rotation по Z

В этом уроке мы научились управлять персонажем и поправили баги в его управлении.

В следующем уроке мы добавим анимацию нашему персонажу при движении.