Орбитальная камера
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 46 из 63.
Чтобы двигаться по кругу вокруг точки, храни угол, поворачивай на него фиксированное смещение и прибавляй результат к точке. Поворот, умноженный на вектор, выполняет вращение: 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 направляет её на статую из каждой новой точки.
Угол хранится в собственном поле, как и в случае углов Эйлера: он может вырасти выше 360 или опуститься ниже 0 без скачка, а ещё его можно ограничить или изменять с клавиатуры. Выполнение этого в LateUpdate() размещает камеру после того, как статуя или игрок переместились в текущем кадре.
Задание
СреднеПозволь игроку перемещать камеру вокруг башни, всегда удерживая её на расстоянии distance (8) единиц от положения башни и направляя на неё. Скрипт хранит два угла в yaw и pitch:
yaw— это угол, на который камера облетела башню. Стрелка вправо увеличивает его, а стрелка влево уменьшает со скоростьюturnSpeed(90) градусов в секунду. При yaw 0 камера находится со стороны -z башни; при yaw 90 — со стороны -x.pitch— это угол в градусах, на который камера поднята над уровнем башни, если смотреть со стороны башни. Стрелка вверх увеличивает его, а стрелка вниз уменьшает со скоростьюtiltSpeed(45) градусов в секунду; угол остаётся в диапазоне от 10 до 60.
Изначально yaw равен 0, а pitch — 30, поэтому камера находится на 4 единицы выше положения башни и на 6.93 единицы позади неё. Нажми Играть, полетай вокруг, затем нажми Проверить.
Попробуйте сами
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 и направьте её на него.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора8Камера
Плавное следованиеОрбитальная камераВзгляд вперёдТряска камерыПовторение: камера преследования