Gamedev
Владимир Семыкин

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

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

Пользователь 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» из выпадающего списка

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

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

Затем перетащите камеру, чтобы установить её базовое положение относительно объекта. Когда вы сделаете это, перенесите значение в поле «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 } }
{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442","\u043a\u043e\u0434","unity"], "comments": 24, "likes": 70, "favorites": 272, "is_advertisement": false, "subsite_label": "gamedev", "id": 609354, "is_wide": true, "is_ugc": false, "date": "Thu, 21 Jan 2021 18:37:40 +0300", "is_special": false }
0
24 комментария
Популярные
По порядку
Написать комментарий...
22

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

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

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

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

Ответить
0

Комментарий удален по просьбе пользователя

Ответить

Народный звук

Ашот
0

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

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

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

Ответить
1

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

Ответить
0

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

Ответить
4

За волшебные константы в Lerp'aх' надо наказывать битой по коленным чашечкам. А то потом удивляются почему на разных устройствах скорости объектов отличаются.

Ответить
3

держите мои компоненты, их можно заюзать для камеры, для камер наблюдения, туреллей, и т.д. 
https://pastebin.com/tCkUvebc - TargetFollowerRotation
https://pastebin.com/YSZyHvct - TargetFollowerPosition

Ответить
3

Мда,
1) кривой туториал
2) чужой кривой туториал

Владимир, может стоит обозревать, то в чем разбираетесь и не трогать unity.

Ответить
2

Как минимум лерпу нужна не статика времени, а связь с дельтой между кадрами. Иначе с разным межфреймовым интервалом будут рывки. 

Ответить
0

Судя по уровню тутора им и так норм.
Можно еще лайфхак подсказать - запоминание начального положения на страте.

Ответить
–3

Полезно...

Ответить
2

Да, полезно. Особенно для криворуких новичков, как я. Спасибо автору.

Ответить
0

Вот тебе, как криворукому новичку, дам совершенно бесплатный совет - учиться надо на ошибках, а не слепо повторять их.

Ответить
1

Срочно несите премию за открытие лерпа народу) 

Ответить
0

А что, в юнити нет готовых предустановок камеры?

Ответить
0

в стандартных ассетах, которым уже лет и лет, есть несколько скриптов

Ответить
0

их недостаточно

Ответить
–1

Тебе Cinemachine недостаточно? :D Нет, скорее всего ты о нём даже не знал..

Ответить
0

Если для новичков, то неплохо бы было для начала хотя бы область применения такой камеры обозначить (кат-сцены и кинематографичное наблюдение).
Чтобы кто-то случайно не решил её использовать для РПГ, например, и потом долго пытался понять, почему персонажем так управлять неудобно.

Ответить
0

Комментарий удален по просьбе пользователя

Ответить
0

топ

Ответить

Комментарии

null