Движение в направлении взгляда
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 41 из 56.
Когда камера смотрит на игрока под углом, стрелки должны перемещать игрока так, как это отображается на экране: нажатие вверх ведёт от камеры, а нажатие вправо — вправо относительно камеры. Оси мира дают такой результат только тогда, когда камера смотрит вдоль +z. Поэтому рассчитывай движение по направлениям самой камеры: cam.forward и cam.right.
Сначала их нужно скорректировать. Если камера смотрит на игрока сверху, её forward направлен в землю, поэтому присвой ему y значение 0, чтобы оставить только составляющую вдоль земли. Получившийся вектор будет короче 1 — примерно 0.87 для камеры, наклонённой вниз на 30 градусов. Игрок будет двигаться медленнее, поэтому нормализуй его. Этот персонаж следует за главной камерой, которая смотрит на угол уровня:
Transform cam = Camera.main.transform;
Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();
Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize(); // по диагонали не быстрее
controller.Move(move * speed * Time.deltaTime);Camera.main — это камера с тегом MainCamera. Направления считываются каждый кадр, поэтому управление продолжает соответствовать экрану при повороте камеры. Одновременное нажатие вверх и вправо складывает два единичных вектора, расположенных под прямым углом друг к другу. Длина получившегося вектора составляет примерно 1.41, поэтому движение нормализуется, если его длина превышает 1.
Задание
СреднеКамера медленно вращается вокруг игрока (CameraRig.cs, готово), поэтому оси мира продолжают поворачиваться на экране. Сделай так, чтобы стрелки перемещали игрока относительно камеры в Mover.cs, где гравитация уже реализована. В Inspector задаются speed (4) и cam — Transform камеры.
- Вверх — идти от камеры по земле, вниз — к ней, вправо и влево — соответственно вправо и влево относительно камеры:
speedединиц в секунду в любом направлении, включая диагонали, даже если камера смотрит на игрока сверху. - Во время движения игрок поворачивается лицом в направлении движения. Когда он останавливается, он продолжает смотреть в том же направлении.
Нажми Play, походи, пока камера поворачивается, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class Mover : MonoBehaviour
{
public float speed = 4f;
public float gravity = -15f;
public Transform cam;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
verticalSpeed += gravity * Time.deltaTime;
// Движется вдоль мировых осей: сделайте так, чтобы он двигался относительно cam и поворачивался в направлении движения
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке8Контроллер персонажа
CharacterController.MoveГравитация вручнуюПрыжкиТолкаем предметыДвижение в направлении взглядаПовторение: двойной прыжок