Найти тему

Unity3D. Перемещение персонажа

В этой статье описано, как создать персонажа и настроить камеру от первого лица:

https://dzen.ru/media/id/63879c35c9d124210bb34194/unity-3d-kamera-ot-pervogo-lica-63e0af1cdc0e2014ed398d7e

Добавим перемещение персонажа. Ранее для реалистичного перемещения твёрдых тел мы использовали компонент Rigidbody, что позволяло использовать физическую систему Unity. Но в данном случае компонент Rigidbody будет нам только мешать, поскольку персонаж будет застревать в небольших неровностях рельефа и нам придется самостоятельно обрабатывать подъем и спуск по слонам. Поэтому мы откажемся от применения физического движка Unity, а вместо этого воспользуемся компонентом CharacterController.

CharacterController по сути является комбинацией коллайдера и метода Move, что позволяет персонажу легко выполнять движение ограниченное столкновениями коллайдеров, без использования компонента Rigidbody. На CharacterController не действуют физические силы, и он будет двигаться только при вызове функции Move. Метод Move перемещает персонажа в указанную позицию, обрабатывая при этом коллизии. Коллизии обрабатываются так, чтобы персонаж мог свободно подниматься на небольшие склоны, но не мог зайти на крутые. Можно использовать различные настройки компонента, которые описаны в официальной документации:

https://docs.unity3d.com/ScriptReference/CharacterController.html

CharacterController не совместим с RigidBody, это значит, что он не может взаимодействовать с другими физическими объектами. Поэтому, если в игре необходимо использовать физику, то CharacterController не подойдет.

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

Добавим компонент CharacterController персонажу и настроим его коллайдер. Центр по оси Y установим в 0.9, радиус зададим равным 0.9, а высоту 1.8.

Настройка CharacterController
Настройка CharacterController

Теперь создадим скрипт персонажу, в котором определим переменную для привязки к этому компоненту:

CharacterController characterController;

В методе Start() необходимо связать переменную с компонентом:

characterController = GetComponent<CharacterController>();

В методе Upadate() получаем значение перемещения, полученного от пользователя:

float deltaHorizontal = Input.GetAxis("Horizontal");

float deltaVertical = Input.GetAxis("Vertical");

И формируем вектор перемещения, не забывая его нормализовать, чтобы перемещение было по всем направлениям одинаковым:

Vector3 inputMove= new Vector3(deltaHorizontal, 0f, deltaVertical);

inputMove.Normalize();

И последнее, что нам остается задать соответствующее перемещение компоненту CharacterController:

characterController.SimpleMove(inputMove);

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

Сейчас перемещение у нас получено в системе координат сцены, где ось x направлена слева направо, а ось Z вглубь сцены, соответственно персонаж идет строго в этих направлениях. Мы же хотим, чтобы перемещение было по направлению взгляда персонажа. То есть герой шел по тому направлению, куда смотрит. Для этого необходимо преобразовать наш вектор перемещения в систему координат, которая задается взглядом персонажа, то есть камерой. Такое преобразование можно выполнить методом TransformDirection:

Vector3 movement = Camera.main.transform.TransformDirection(inputMove);

Теперь задаем перемещение персонажу с помощью этого преобразованного вектора:

characterController.SimpleMove(movement);

Отлично, теперь персонаж перемещается по направлению своего взгляда.

Добавим переменную для корректировки скорости перемещения:

public float moveSpeed = 10f;

И используем ее при задании перемещения:

characterController.SimpleMove(movement * moveSpeed);

Последнее, что нам осталось сделать - это добавить поворот персонажа, чтобы он сам поворачивался по направлению своего взгляда (то есть камеры). При использовании компонента CharacterController вращение мы будем применять непосредственно к самому игровому объекту:

transform.rotation = Camera.main.transform.rotation;

Итоговый скрипт будет выглядеть следующим образом:

Скрипт персонажа
Скрипт персонажа

Перемещение должно получится как на видео. Направление взгляда определяется движением мыши, а перемещение клавишами клавиатуры: