Menu
CoddyTech

Орбитальная камера

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

Чтобы описать круг вокруг точки, храни угол, поверни на него фиксированное смещение и прибавь результат к точке. Умножение вектора на вращение поворачивает его: Quaternion.Euler(0, angle, 0) * offset вращает смещение вокруг оси y, при этом его длина и высота остаются прежними. Эта камера облетает статую со скоростью 20 градусов в секунду, всегда находясь на высоте 3 и на расстоянии 6:

public Transform statue;
public float speed = 20f;
float angle;

void LateUpdate()
{
    angle += speed * Time.deltaTime;
    Vector3 offset = new Vector3(0, 3, -6);
    transform.position = statue.position + Quaternion.Euler(0, angle, 0) * offset;
    transform.LookAt(statue);
}

При угле 0 смещение равно (0, 3, -6), поэтому камера находится за статуей. При 90 оно равно (-6, 3, 0), то есть камера находится со стороны -x от статуи, а при 180 — (0, 3, 6), то есть перед ней. Перемещение камеры не поворачивает её, поэтому LookAt наводит её на статую из каждой новой точки.

Второй угол поднимает камеру: Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance) поворачивает направление назад вверх на pitch (положительный поворот вокруг x наклоняет (0, 0, -1) вверх), а затем поворачивает его вокруг оси на yaw, поэтому камера остаётся на расстоянии distance при любом угле.

Угол хранится в собственном поле, как в разделе «Углы Эйлера»: он может увеличиваться больше 360 или уменьшаться ниже 0 без скачков, а ты можешь ограничивать его или менять с клавиатуры. Выполнение этого в LateUpdate() размещает камеру после перемещения статуи или игрока в текущем кадре.

challenge icon

Задание

Средне

Позволь игроку перемещать камеру вокруг башни.

  1. В Update() стрелки вправо и влево изменяют yaw со скоростью turnSpeed, а стрелки вверх и вниз — pitch со скоростью tiltSpeed, умноженной на Time.deltaTime.
  2. Затем оставь pitch = Mathf.Clamp(pitch, 10f, 60f);.
  3. В LateUpdate() задай transform.position = target.position + Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance);, затем transform.LookAt(target);.

Нажми «Играть» и облети башню. Затем нажми «Проверить».

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

using UnityEngine;

public class OrbitCamera : MonoBehaviour
{
    public Transform target;
    public float distance = 8f;
    public float turnSpeed = 90f;
    public float tiltSpeed = 45f;
    public float yaw = 0f;
    public float pitch = 30f;

    void Update()
    {
        // Клавиши со стрелками изменяют yaw и pitch.
    }

    void LateUpdate()
    {
        // Расположите камеру вокруг target и направьте её на него.
    }
}

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

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