Зачем нужен метод Update и как его использовать?

Общие вопросы о Unity3D

Зачем нужен метод Update и как его использовать?

Сообщение EIvanov 05 май 2023, 22:54

Задумался над этим вопросом, после двух месяцев работы с юнити. И ошибок и глюков в моих проектах.
Метод Update выполняется с каждым обновлением экрана, т.е. зависит от настройки частоты обновления экрана пользователя.
Метод FixedUpdate - по умолчанию выполняется 50 раз в секунду (можно настроить). В нем обычно пишется логика, расчет передвижения игрока и т.д.
В чем проблема - эти 2 метода не синхронизированы.

То есть я делаю все расчеты, например движение, в FixedUpdate. А вызов/смену анимации (это же отображение, не расчет) в Update.

Пример
Синтаксис:
Используется csharp
void FixedUpdate()
{
if (horizontalInput>0) /Vector3 movement = new Vector2(horizontalInput* playerSpeed, rb.velocity.y);
}      

void Update()
{
if (horizontalInput>0) playAnimation=1; // Устанавливаем значение переменной в аниматоре - переход по стрелке к анимации.
}


FixedUpdate и Update имеют разную частоту выполнения и, как я полагаю, не синхронизированы.
Итого, в примере выше, либо анимация начнется раньше движения, либо движение, раньше анимации.

Решение - перенести всё в FixedUpdate.
Проблема - он вызывается 50 раз в сек., что медленно (пользователь может жать клавишу 6 раз в секунду). Настраивать FixedUpdate до 300 раз в сек? Непонятно...

И зачем тогда Update?
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Зачем нужен метод Update и как его использовать?

Сообщение Saltant 06 май 2023, 01:41

В апдейте инпуты считываются обычно. В Фиксед физика.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Зачем нужен метод Update и как его использовать?

Сообщение waruiyume 06 май 2023, 02:34

В апдейте обновлять ввод, графику и гуй, а фикседе физику. Правда у ригидбоди можно включить интерполяцию и графика тоже перестанет дёргаться.
Пример с анимации очень интересный. Даже если и перемещение и запуск анимации перенести в апдейт, графика и движение всё равно будут в рассинхроне. Работает в 90% игр: спамим кнопку движения, и персонаж либо едет по полу, вообще не поднимая ноги, либо едет на одной ноге. В некоторой степени это решается использование rootmotion, но делает управление менее отзывчивым.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Зачем нужен метод Update и как его использовать?

Сообщение EIvanov 06 май 2023, 23:25

Saltant
В апдейте инпуты считываются обычно. В Фиксед физика.

Про инпуты немного не соглашусь. Инпут напрямую влияет на персонажа, на его движение (мой код выше с horizontalInput), на его анимацию (нажали кнопку влево - пошел влево) на физику (нажали прыжок - прыгнул).
Итого опять приходим к рассинхронизации. К сожалению, это не моя теория - а мои ошибки. Я как раз и считывал инпуты в апдейте и получал баги рассинхрона.

waruiyume
В апдейте обновлять ввод, графику и гуй, а фикседе физику.

Рассинхронизация.
А есть ещё проблема - разная частота выполнения методов.

Предположим что мы настроили FixedUpdate на выполнение 1 раз в минуту (можем же?). Ну а Update - пусть выполняется 60 раз в сек - так у нас настроен графический адаптер (60 герц).
Нажали на кнопку - ввод обновляется в апдейте, анимация там же. Анимация = игрок бежит, всё обновилось....а вот физика в FixedUpdate нет - т.е. ждать в течении минуты. Итого видим - игрок бежит на месте.
Наглядный пример лага. В реале, конечно происходят микролаги.

Даже если и перемещение и запуск анимации перенести в апдейт

Нельзя перемещение делать в Update. этот метод выполняется у всех с разной частотой.
Просто перенести в FixedUpdate. И рассинхрона нет - потому что код в одном методе, а метод выполняется фиксированное количество раз в сек на любых устройствах, с любой настройкой графики.

Зачем тогда Update? У него априори неизвестная частота обновления. А может она будет 30 раз в сек? Или 120 раз в сек? И потом как то продумывать синхронизацию с FixedUpdate...
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Зачем нужен метод Update и как его использовать?

Сообщение waruiyume 07 май 2023, 00:07

Про инпуты немного не соглашусь.

Note: Input flags are not reset until Update. You should make all the Input calls in the Update Loop.
https://docs.unity3d.com/ScriptReference/Input.html

Нельзя перемещение делать в Update. этот метод выполняется у всех с разной частотой.

И что? Если у меня персонаж ходит по клеткам в корутине, считай в апдейте, и ни с чем не сталкивается, тоже низя?
Вообще, у аниматора есть переключение времени типа апдейта, ставим "фиксед" и фсё- что бы с ним в апдейте не делали обновится от только с физикой. Только прикол который я описал, со спамом кнопки движения, никуда не денется.
Апдейт нужен для нефизики, чтобы изменения были плавные, без интерполяции, ригидбоди, который только трасформ интерполирует.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8