~2 мин чтения

Камера и Cinemachine

Виды от первого/третьего лица, виртуальные камеры и плавный follow без матана.

Camera-компонент

Камера в Unity — обычный GameObject с компонентом Camera. Главные поля:

  • ProjectionPerspective (3D, с перспективой) или Orthographic (без перспективы; 2D/изометрия).
  • FOV (Field of View) — угол обзора по вертикали в градусах. Стандарт для FPS — 60–90°.
  • Clipping Planes: Near / Far — расстояние ближней и дальней плоскости отсечения. Всё, что ближе Near или дальше Far, не рисуется. Большой разброс (например, 0.01 ↔ 10000) ухудшает точность Z-buffer и приводит к “Z-fighting” — мерцающим пересечениям. Старайтесь держать Far/Near < ~10000.
  • Culling Mask — какие слои объектов рисует эта камера.
  • Target Texture — рендерить картинку не на экран, а в текстуру (мини-карты, портал-эффекты).
  • Depth — порядок отрисовки нескольких камер.
// Простой follow-камера в LateUpdate
public class SimpleFollow : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField] private Vector3 offset = new Vector3(0, 2f, -4f);
    [SerializeField] private float smoothTime = 0.15f;

    private Vector3 _velocity;

    private void LateUpdate() {
        Vector3 desired = target.position + target.rotation * offset;
        transform.position = Vector3.SmoothDamp(transform.position, desired, ref _velocity, smoothTime);
        transform.LookAt(target.position + Vector3.up * 1.5f);
    }
}

Vector3.SmoothDamp — критически удобная функция: сглаживает движение с пружинной механикой, без пересохранения целевой позиции. Хранит “скорость” во внешней переменной.

Следящая камера — это LateUpdate

Если двигать камеру в Update, она может догонять цель на кадр позже. LateUpdate гарантирует, что цель уже перемещена в этом кадре.

Cinemachine — следить за целью без боли

Cinemachine — UPM-пакет (предустановлен в стандартных шаблонах Unity 6, но всё ещё устанавливается через Package Manager) с виртуальными камерами. Идея: на сцене одна реальная Camera, а Cinemachine динамически переключает её на разные виртуальные точки зрения. Без скриптов можно собрать:

  • Follow — следить за объектом с задержкой и demping.
  • Look At — смотреть на объект, плавно поворачиваясь.
  • FreeLook — орбитальная камера с тремя кольцами (третье лицо, как в Dark Souls).
  • Cart/Dolly — движение по сплайну.
  • State-Driven Camera — переключение виртуальных камер по состоянию Animator.

Базовая follow-camera в Cinemachine 3.x

В Unity 6 поставляется Cinemachine 3, у которого API заметно отличается от 2.x:

  1. Добавьте на сцену CinemachineCamera (раньше — CmCamera/CinemachineVirtualCamera).
  2. В поле “Tracking Target” укажите Transform игрока.
  3. На виртуальной камере добавьте stage-компоненты (наследники CinemachineComponentBase): CinemachineFollow (раньше Body) и CinemachineHardLookAt / CinemachineRotationComposer (раньше Aim). Это отдельная категория, не то же самое, что Cinemachine Extensions (Impulse Listener, Deoccluder и др.).

Один CinemachineBrain на основной Camera автоматически блендит между активными виртуальными камерами по приоритету. Хотите переключить вид? vcam.Priority = 100; — и Brain мягко переедет туда за заданное время блендинга.

public class CameraSwitcher : MonoBehaviour
{
    [SerializeField] private Unity.Cinemachine.CinemachineCamera firstPerson;
    [SerializeField] private Unity.Cinemachine.CinemachineCamera thirdPerson;

    public void SwitchToFP() {
        firstPerson.Priority  = 20;
        thirdPerson.Priority  = 10;
    }
}
Cinemachine 2.x → 3.x

Если читаете старые туториалы — там CinemachineVirtualCamera с Body и Aim секциями. В Unity 6 это CinemachineCamera с отдельными компонентами-расширениями. Концепция та же, имена другие.

Главный совет про камеру

Камера — это режиссёр, а не оператор-стажёр.

Лучшая камера — та, которую игрок не замечает. Сделайте плавность (smooth follow), запас по углу обзора, чтобы цель не упиралась в край экрана, и не давайте камере прыгать на резких поворотах персонажа. Cinemachine за вас уже учитывает большинство этих случаев — пользуйтесь.

В следующей главе — рендеринг: как Unity вообще рисует пиксели.