Как сделать плавное движение камеры в unity

Добавил пользователь Skiper
Обновлено: 31.08.2024

Я хочу сделать экран выбора машины для своей игры. Я могу перемещать камеру с помощью мыши по машине. Камера двигается, только когда я держу кнопку мыши. Когда я отпускаю кнопку мыши, камера мгновенно останавливается. Но я хочу медленно останавливать камеру. Я не хочу использовать Cinemachine. Итак, как я могу медленно остановить камеру, когда отпущу кнопку мыши? Это код, который я сейчас использую:

2 ответа

Я бы попробовал что-то вроде (не отлажено):

Вы можете играть вокруг со значением sesitivityDecrease , пока не добьетесь нужного эффекта.

любой Awake выполняется до функции Start, фактически Awake выполняется единожды за существование объекта перед любой другой функцией, awake в unity - аналог конструктора класса.
Рекомендуется параметры, объекты объявлять в Awake.

В данном случае Lerp позволил сделать специфическое движение - сначала медленно, затем быстрее и в конце снова медленнее. С помощью Cos.
Я верно понял?

Лерп - это метод интерполяции, а любой твинер - это интерполяция двух точек. Про косинус, то тут да, в некотором смысле он и помогает "сделать этот эффект", ну а с другой стороны он нужен немного для другого.

Насчет Авейка, почему я спросил, просто Авейк стартует сразу как только "компонент" создан, а вот Старт - когда объект полностью инициализирован на сцене, по этому могут быть "проблемы", с доступом к объекту. Но я еще такие проблемы не встречал, но теоретически они могут быть smile

В данном случае игровая камера УЖЕ находится в сцене - а поэтому авейк оправдан - ошибки не будет. Так же как правило такие функции ты применяешь к УЖЕ созданным объектам в сцене - вероятность ошибки сводится к нулю. Я понимаю о чем ты;-) В теории такая вероятность существует. На практике такого не разу не было.

В данном случае Lerp позволил сделать специфическое движение - сначала медленно, затем быстрее и в конце снова медленнее. С помощью Cos.
Я верно понял?

Как правильно скзаал noTformat Лерп - это метод интерполяции. Cos дает более плавное смещение.
ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю


Разработка компьютерных игр. С чего начать? Это просто! С нуля до разработчика игр: как начать создавать свою игру. Заказать создание игры.

Камера является одним из самых важных элементов в 3D-игре. Он действует как глаза игрока, позволяя им видеть игровой мир с разных точек зрения. В Unity3D 3D-камера работает так же, как пленочная камера. Его можно панорамировать, наклонять и масштабировать для кадрирования сцен. Из этого туториала вы узнаете, как создавать несколько перспектив камеры от третьего лица.

Для вдохновения или для использования в качестве отправной точки для своей работы ознакомьтесь с некоторыми из самых популярных 3D-моделей на Envato Market. Или получите помощь один на один, выбрав один из сервисов 3D-дизайна и моделирования в Envato Studio.


Настройка проекта

Нам нужен простой проект для тестирования скриптов нашей камеры. Нам понадобится сцена с земной плоскостью, на которой есть текстура. Это позволит легко увидеть, как каждая камера движется и реагирует на входы игроков. Когда мы закончим, это должно выглядеть так:

Готовая сцена

Выполните следующие шаги для настройки проекта:

Создать игрока

Все камеры, которые мы собираемся создать, будут нуждаться в цели: на что-то смотреть или следовать. Итак, давайте создадим основного игрока, которого мы можем перемещать с помощью клавиш со стрелками.

В сценарии Player добавьте два открытых свойства для движения и скорости поворота. Затем добавьте следующий код в ваш метод Update ():

Инспектор игрока

Взгляд на камеру

Это самая простая камера от третьего лица. Он находится в фиксированном месте в трехмерном мире и отслеживает свою цель, как турель.

В сценарии LookAtCamera создайте открытый атрибут для цели нашей камеры в верхней части класса. Открытые атрибуты доступны в Инспекторе и позволят нам назначить Player в качестве цели камеры:

Далее нам нужно указать преобразование нашей камеры, чтобы посмотреть на целевой объект. К счастью, у объектов преобразования есть удобный метод LookAt (), который мы можем использовать для этого. Мы могли бы сделать это в методе Update (), но вместо этого мы создали метод LateUpdate (). Как правило, во всех сценариях камеры всегда следует использовать метод LateUpdate () вместо метода Update (). LateUpdate () происходит после завершения Update (), поэтому у сценария Player есть шанс закончить вычисление позиции игрока до того, как камера вычислит свою позицию. Это приводит к более плавному движению камеры:

Финальный скрипт должен выглядеть так:

Перетащите игрока в инспектор

Dungeon Crawler Camera

В сценарии DungeonCamera нам снова нужно создать открытый атрибут для цели нашей камеры. Нам также нужно создать переменную для хранения смещения между камерой и ее целью. Смещение представлено в виде вектора 3 и будет использоваться для сохранения относительного расстояния при перемещении игрока. Вы можете заметить, что мы не присваиваем смещению значение при первом его объявлении. Это потому, что мы будем вычислять значение при первом запуске скрипта. Мы можем использовать метод Start () для этого:

Когда я хочу переместить камеру из исходного положения в конечное положение, она выглядит очень жесткой. Так что, если она может установить скорость перемещения в соответствии со смещением, как это сделать?

4 ответа

Вы можете использовать плагины iTween. И если вы хотите, чтобы ваша камера двигалась вместе с вашим объектом, то есть плавно следовала за ним. Вы можете использовать скрипт smoothFollow.

Вы пытались использовать Vector3.MoveTowards? Вы можете указать размер шага, который должен быть достаточно плавным.

Есть хороший учебник по этой проблеме, который обычно описывается в начале всех учебников на веб-сайте Unity. В руководстве Survival Shooter есть объяснение, как сделать движение камеры в конечной позиции плавным при движении.

Вот код для перемещения камеры. Создайте сценарий, добавьте его в камеру и добавьте GameObject Вы хотите перейти в заполнитель сценариев. Он автоматически сохранит компонент Transform, такой как настройка, в скрипте. (В моем случае это игрок учебника по стрельбе на выживание):

Это 2d runner/platformer, вид сбоку. Соответственно на экране есть движущиеся бэкграунд и препятствия. А мы управляем персонажем вверх/вниз для преодоления препятствий.

Возникла проблема, что визуально движущаяся картинка лагает. То есть двигается рывками или создает ощущение остаточного шлейфа от объектов на iOS-устройстве. В XCode количество кадров 30 и более.

Есть объекты plain, на них навешан скрипт такой:

Вопрос такой - как сделать движение объектов плавным, без рывков и дрожания на экране когда играем? Возможно что-то не так с настройками framerate. Может кто-нибудь сталкивался с подобным и нашел решение?

проверь, точно ли у тебя изменение положения происходит перед рендером. нет ли пропусков или внеочередного исполнения.
когда (и только тогда) ты будешь уверен что положение меняется перед рендером, и в рендер попадает актуальные данные, будешь придумывать что-то еще.
часто в слишком универсальных архитектурах не очень очевидно что за чем исполняется, а иногда оно и просто меняет порядок.

у нас был похожий косяк - оказалось обработка тача, которым скроллили фон, шла после рендера, поставили перед ним и все ок. еще дрожание может быть, если текстура, натянутая на объект, без линейной фильтрации, а координаты объекта с текстурой заданы через float. тут дрожание будет +- 1 пиксель.

Если это начинает происходить при отдалении от стартовой точки на значительное расстояние, и не применяется никакого смещения центра координат, то это может быть погрешность при сложении данных типа float сразу большого порядка (расстояние от центра до текущей точки) с малым (скорость движения)

например за двадцать минут мы можем пройти по оси X 128.0f * 60 * 20 = 153600.0f , это наша текущая координата X.
скорость Time.DeltaTime * Speed , это при 30 fps идентично 0.03 * 128.0f = 3.84f

движение по вектору скорости в этот момент будет операцией 153600.0f + 3.84f
при этом тип данных float оперирует числом в пределах 32768 с мантиссой (смещение по разряду)
если поделить 153600.0f / 3.84f то получим число 40000 , это число больше 32768 , следовательно при этой операции последний меньший разряд отбросится и мы переместимся на 3.80f вместо 3.84f , а так как fps у нас непостоянный, то от этого и происходит дёргание - то больше прибавится , то меньше, сооветственно то 3 разряда применятся, а то 2. пройдя таким образом ещё ~20 минут скачки увеличатся ещё на один двоичный разряд

Chupakaber
Все начинает "дрожать" практически с первых секунд. С плавным увеличение скорости это просто становится все заметнее. И уже очень заметно, когда скорость движения достигает выставленного значения смещения по горизонтали в 512 px в секунду.

Игра тормозит или всё-время упирается в ограничитель ФПС?

Попробуй по совету Pushkoff изменять координаты перед рендером
Для этого в юнити нужно вместо события void Update() <> использовать void FixedUpdate() <>

Pushkoff
Chupakaber

Я делал с фиксированным вариантом и уменьшал fixedDeltaTime до 0.01(вместо 0.02 по умолчанию).
Что происходит - дергается так же, но на меньшие промежутки.

Vostorg_msk
тогда скорость попробуй считать по другому
time += deltatime;
p = time * speed;

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

Читайте также: