Орбитальная камера
Часть раздела Физика и игровой процесс путешествия по 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() размещает камеру после перемещения статуи или игрока в текущем кадре.
Задание
СреднеПозволь игроку перемещать камеру вокруг башни.
- В
Update()стрелки вправо и влево изменяютyawсо скоростьюturnSpeed, а стрелки вверх и вниз —pitchсо скоростьюtiltSpeed, умноженной наTime.deltaTime. - Затем оставь
pitch = Mathf.Clamp(pitch, 10f, 60f);. - В
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 и направьте её на него.
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монеты8Камера
Плавное следованиеОрбитальная камераВзгляд вперёдТряска камерыПовторение: камера преследованияПотренируйтесь самостоятельно: Песочница Unity