Создание эффекта плавной камеры, следующей за объектом — краткий туториал Статьи редакции
Поэтапное описание реализации эффекта с примером кода.
Пользователь Reddit под ником Awsomelity опубликовал короткий туториал для Unity, в котором показал, как сделать камеру, плавно следующую за объектом. Автор представил код, а также подробно показал все этапа реализации этого эффекта.
На сцене вам понадобится лишь несколько объектов: направленный свет, плоскость, предмет и камера. Сперва нужно создать скрипт.
Затем прикрепите скрипт к камере и откройте его. В этом окне удалите ненужную часть кода.
Затем вам нужно добавить переменную «object» — это объект, за которым следует камера, а также переменную «distanceFromObject» — дистанция камеры относительно объекта. Для этого добавьте следующий код:
Затем нужно добавить функцию «LateUpdate».
Новая часть кода:
Пора добавлять новые переменные: «positionToGo» — переменная, которая указывает на какую позицию переместится камера, «smoothPosition» определяет, насколько плавным будет перемещаться камера. Показатель «t:0.125F» определяет скорость движения камеры — вы можете замедлить или ускорить её, меняя значение. Пример кода:
Затем перетащите камеру, чтобы установить её базовое положение относительно объекта. Когда вы сделаете это, перенесите значение в поле «Distance From Object», которое находится в окне Inspector.
На этом этапе эффект плавной камеры выглядит вот так:
Но это пока не финальная версия эффекта. Теперь нужно сделать так, чтобы камера поворачивалась за объектом. Для этого достаточно всего одной строчки кода:
Вот так выглядит финальная версия эффекта:
Полный код:
Даже по последней гифке видно, что камера нифига не плавно поворачивает.
Автору стоит почитать и понять то как работает lerp, в его варианте каждый вызов ф-ии LateUpdate будет перемещать камеру на 12.5% от требуемого смещения. И чем дальше и быстрее обьект будет удаляться от камеры тем более вырвиглазно это будет выглядеть.
К тому же, константное значение dt в лерпе делает его fps-независимым => на разных fps, результат будет выглядеть по разному.
Для действительно плавного движения нужно либо кидать реальный dt, либо задавать тайминг за который камера должна "догонять" обьект и использовать этот тайминг (ессно с реальным dt) в функциях плавности (https://easings.net/ru)
Нынешний жар
Да вообще пиздец. Самое главное, плавная камера вещь действительно нужная, особенно плавная камера с ограниченными углами поворотов, в широкими диапазоне угловых и линейных скоростей, с контролем тайминга поворотов и движения, расстояний, ну и т.д. Да и тонкости могут разные быть всякие особенно в сочетании с UI и физикой.
Но нет, все завалено исключительно статьями про lerp в LateUpdate, еще и с ошибками, lol.
Эт если честно немного напрягает — везде одно и тоже и далеко от интересных рецептов профессионалов (как например, раньше выпускались всякие Gems)
Да, юнитевцы и сами выкатили урок. https://www.youtube.com/watch?v=537B1kJp9YQ&ab_channel=Unity
За волшебные константы в Lerp'aх' надо наказывать битой по коленным чашечкам. А то потом удивляются почему на разных устройствах скорости объектов отличаются.
держите мои компоненты, их можно заюзать для камеры, для камер наблюдения, туреллей, и т.д.
https://pastebin.com/tCkUvebc - TargetFollowerRotation
https://pastebin.com/YSZyHvct - TargetFollowerPosition
Как минимум лерпу нужна не статика времени, а связь с дельтой между кадрами. Иначе с разным межфреймовым интервалом будут рывки.
Судя по уровню тутора им и так норм.
Можно еще лайфхак подсказать - запоминание начального положения на страте.
в стандартных ассетах, которым уже лет и лет, есть несколько скриптов
Если для новичков, то неплохо бы было для начала хотя бы область применения такой камеры обозначить (кат-сцены и кинематографичное наблюдение).
Чтобы кто-то случайно не решил её использовать для РПГ, например, и потом долго пытался понять, почему персонажем так управлять неудобно.