Создание эффекта плавной камеры, следующей за объектом — краткий туториал

Поэтапное описание реализации эффекта с примером кода.

Пользователь Reddit под ником Awsomelity опубликовал короткий туториал для Unity, в котором показал, как сделать камеру, плавно следующую за объектом. Автор представил код, а также подробно показал все этапа реализации этого эффекта.

На сцене вам понадобится лишь несколько объектов: направленный свет, плоскость, предмет и камера. Сперва нужно создать скрипт.

Создание скрипта
Создание скрипта

Затем прикрепите скрипт к камере и откройте его. В этом окне удалите ненужную часть кода.

Удалите часть, выделенную синим цветом
Удалите часть, выделенную синим цветом

Затем вам нужно добавить переменную «object» — это объект, за которым следует камера, а также переменную «distanceFromObject» — дистанция камеры относительно объекта. Для этого добавьте следующий код:

{ [SerializeField] private GameObject _object; //An object camera will follow [SerializeField] private Vector3 _distanceFromObject; // Camera's distance from the object

Затем нужно добавить функцию «LateUpdate».

Выберите функцию «LateUpdate» из выпадающего списка
Выберите функцию «LateUpdate» из выпадающего списка

Новая часть кода:

Event function private void LateUpdate() //Works after all update functions called

Пора добавлять новые переменные: «positionToGo» — переменная, которая указывает на какую позицию переместится камера, «smoothPosition» определяет, насколько плавным будет перемещаться камера. Показатель «t:0.125F» определяет скорость движения камеры — вы можете замедлить или ускорить её, меняя значение. Пример кода:

{ Vector3 positionToGo = _object.transform.position + _distanceFromObject; //Target position of the camera Vector3 smoothPosition = Vector3.Lerp(a:transform.position, b:positionToGo, t:0.125F); Smooth position of the camera transform.position = smoothPosition;
Переместите объект со сцены в поле «Object» в окне Inspector
Переместите объект со сцены в поле «Object» в окне Inspector

Затем перетащите камеру, чтобы установить её базовое положение относительно объекта. Когда вы сделаете это, перенесите значение в поле «Distance From Object», которое находится в окне Inspector.

На этом этапе эффект плавной камеры выглядит вот так:

Камера плавно передвигается за объектом

Но это пока не финальная версия эффекта. Теперь нужно сделать так, чтобы камера поворачивалась за объектом. Для этого достаточно всего одной строчки кода:

transform.LookAt(_object.transform.position); //Camera will look(returns) to the object } }

Вот так выглядит финальная версия эффекта:

Камера плавно следует за объектом и поворачивается за ним

Полный код:

{ [SerializeField] private GameObject _object; //An object camera will follow [SerializeField] private Vector3 _distanceFromObject; // Camera's distance from the object Event function private void LateUpdate() //Works after all update functions called { Vector3 positionToGo = _object.transform.position + _distanceFromObject; //Target position of the camera Vector3 smoothPosition = Vector3.Lerp(a:transform.position, b:positionToGo, t:0.125F); Smooth position of the camera transform.position = smoothPosition; transform.LookAt(_object.transform.position); //Camera will look(returns) to the object } }
7979
24 комментария

Даже по последней гифке видно, что камера нифига не плавно поворачивает.

Автору стоит почитать и понять то как работает lerp, в его варианте каждый вызов ф-ии LateUpdate будет перемещать камеру на 12.5% от требуемого смещения. И чем дальше и быстрее обьект будет удаляться от камеры тем более вырвиглазно это будет выглядеть.

К тому же, константное значение dt в лерпе делает его fps-независимым => на разных fps, результат будет выглядеть по разному.

Для действительно плавного движения нужно либо кидать реальный dt, либо задавать тайминг за который камера должна "догонять" обьект и использовать этот тайминг (ессно с реальным dt) в функциях плавности (https://easings.net/ru)

22
Ответить

Комментарий недоступен

Ответить

Да вообще пиздец. Самое главное, плавная камера вещь действительно нужная, особенно плавная камера с ограниченными углами поворотов, в широкими диапазоне угловых и линейных скоростей, с контролем тайминга поворотов и движения, расстояний, ну и т.д. Да и тонкости могут разные быть всякие особенно в сочетании с UI и физикой.

Но нет, все завалено исключительно статьями про lerp в LateUpdate, еще и с ошибками, lol.

Эт если честно немного напрягает — везде одно и тоже и далеко от интересных рецептов профессионалов (как например, раньше выпускались всякие Gems)

Ответить

Cinemachine

17
Ответить

Да, юнитевцы и сами выкатили урок. https://www.youtube.com/watch?v=537B1kJp9YQ&ab_channel=Unity

1
Ответить

Для быстрой эффективной реализации - да.
Но в данном случае, как я понял, контент именно что обучающий.

Ответить