Menu
CoddyTech

Движение в направлении взгляда

Часть раздела Создание настоящих игр путешествия по 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.

challenge icon

Задание

Средне

Камера медленно вращается вокруг игрока (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);
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр