Menu
CoddyTech

Взгляд вперёд

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 49 из 71.

Камера, расположенная по центру движущегося игрока, показывает не только то, куда он направляется, но и то, где он уже был. Вместо этого можно использовать боковой ракурс: размести камеру на расстоянии нескольких единиц перед игроком, с той стороны, куда он движется.

Когда игрок разворачивается, сторона меняется, и если камера сразу же переместится на другую сторону, весь вид резко скачет. Поэтому храни опережение в поле и постепенно сдвигай его к новому значению с помощью Mathf.MoveTowards — понемногу каждый кадр. Эта камера лодки опережает её на 2 единицы и смещается со скоростью 3 единицы в секунду:

float lead;
float heading = 1f;   // 1 — плывёт вправо, -1 — плывёт влево

void LateUpdate()
{
    lead = Mathf.MoveTowards(lead, heading * 2f, 3f * Time.deltaTime);
    transform.position = new Vector3(boat.position.x + lead, transform.position.y, transform.position.z);
}

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

challenge icon

Задание

Средне

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

  1. В LateUpdate() сравнивай координату x бегуна с lastX: движение вправо задаёт direction значение 1, влево — -1, а если бегун стоит на месте, оставляй значение без изменений.
  2. Плавно изменяй shift = Mathf.MoveTowards(shift, direction * ahead, shiftSpeed * Time.deltaTime);.
  3. Задай координату x камеры равной player.position.x + shift, сохранив значения y и z.

Нажми «Играть» и побегай в обе стороны. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class LookAheadCamera : MonoBehaviour
{
    public Transform player;
    public float ahead = 3f;
    public float shiftSpeed = 4f;

    void LateUpdate()
    {
        // Смещайте камеру перед игроком на ahead единиц в направлении его последнего движения, плавно перемещая её со скоростью shiftSpeed.
        transform.position = new Vector3(player.position.x, transform.position.y, transform.position.z);
    }
}

Все уроки раздела Физика и игровой процесс

Потренируйтесь самостоятельно: Песочница Unity