Добавить в корзинуПозвонить
Найти в Дзене
Геймдев после 30

Основы Unity # 1 – метод Update()

Update() – это сердце вашей игры. А вы знаете, как оно бьется? Приветствую, коллеги! Мы продолжаем серию статей, в которых подробно разбираем самые важные инструменты, компоненты и методы в Unity. И сегодня под микроскопом – метод Update(). Меня зовут Андрей. Я учусь на юнити-программиста, осваиваю геймдизайн и веду блог «Геймдев после 30». Чтобы стать настоящим профессионалом, недостаточно просто писать код по шаблону. Важно понимать, как он работает изнутри. Такой поход заложит прочный фундамент для роста и поможет создавать технически качественные игры. Представьте, что ваша игра – это живой человек. Чтобы жить, ему нужно, чтобы сердце билось, легкие дышали, а мозг обрабатывал информацию от органов чувств. Эти процессы происходят постоянно, циклически. Update() – это и есть сердцебиение вашей игры. Это метод, который Unity вызывает снова и снова, каждый кадр (fps), много раз в секунду, пока игра запущена. Каждый вызов Update() – это как один "тик" часов, одно биение сердца. В этом м
Оглавление

Update() – это сердце вашей игры. А вы знаете, как оно бьется?

Приветствую, коллеги! Мы продолжаем серию статей, в которых подробно разбираем самые важные инструменты, компоненты и методы в Unity. И сегодня под микроскопом – метод Update().

Меня зовут Андрей. Я учусь на юнити-программиста, осваиваю геймдизайн и веду блог «Геймдев после 30». Чтобы стать настоящим профессионалом, недостаточно просто писать код по шаблону. Важно понимать, как он работает изнутри. Такой поход заложит прочный фундамент для роста и поможет создавать технически качественные игры.

1. Аналогия: Игра как живой организм

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

Update() это и есть сердцебиение вашей игры. Это метод, который Unity вызывает снова и снова, каждый кадр (fps), много раз в секунду, пока игра запущена. Каждый вызов Update() – это как один "тик" часов, одно биение сердца. В этом методе происходит всё, что должно меняться в реальном времени:

  • Кинематическое движение объектов
  • Плавное изменение значений (интерполяция)
  • Обработка нажатий клавиш
  • Таймеры
  • Проверка условий (например, закончились ли жизни)

2. Где находится Update() и как его использовать?

Когда вы создаете новый скрипт в Unity, например – PlayerController.cs, по умолчанию в нем уже есть заготовка Update(). Либо вы можете сами его прописать и он автоматически заработает. Главное, чтобы ваш скрипт наследовался от MonoBehaviour, о том, что это такое мы поговорим в другой раз. Пока просто запомните, что после названия вашего скрипта должно следовать : MonoBehaviour.

-2

Простое правило: Если действие должно происходить постоянно, его код нужно поместить внутрь фигурных скобок { } метода Update().

3. Практический пример: Двигаем кубик

Давайте сделаем так, чтобы наш игровой объект (например, кубик) двигался вперед по нажатию стрелки "Вверх".

-3

Что здесь происходит:

  1. Input.GetKey(KeyCode.UpArrow) – каждое биение сердца (каждый кадр) игра проверяет: "А нажата ли сейчас кнопка 'Вверх'?".
  2. transform.Translate(...) – если кнопка нажата, игра сдвигает позицию нашего объекта.
  3. Vector3.forward – это направление "вперед" (по оси Z).
  4. speed – наша переменная, которая контролирует, как быстро двигаться.

4. Важнейший нюанс: Time.deltaTime выравниваем скорость

А теперь самый важный момент для новичка, без понимания которого всё пойдет наперекосяк.

Проблема: Частота вызова Update() непостоянна. На мощном компьютере игра может работать со скоростью 200 кадров в секунду, на слабом – 30 кадров. Если просто написать transform.Translate(Vector3.forward * speed), то на мощном ПК объект будет двигаться в 6-7 раз быстрее! Это неприемлемо.

Решение: Time.deltaTime.

Time.deltaTime – это время в секундах, которое прошло с момента предыдущего кадра до текущего.

  • На 200 FPS Time.deltaTime будет очень маленьким (~0.005 секунды).
  • На 30 FPS Time.deltaTime будет больше (~0.033 секунды).

Умножая нашу скорость на Time.deltaTime, мы говорим: "Сдвинь объект не на 5 единиц за кадр, а на 5 единиц за секунду". Таким образом, скорость становится независимой от частоты кадров. Всегда используйте Time.deltaTime для любых перемещений и поворотов внутри Update().

5. Родственные методы: FixedUpdate() и LateUpdate()

Unity – умная система. Помимо Update(), у нее есть еще два важных "сердцебиения":

  1. FixedUpdate() – вызывается с фиксированной частотой (по умолчанию 50 раз в секунду). Идеально подходит для физических расчетов (движение через Rigidbody). Физический движок Unity работает именно в этом методе.
  2. LateUpdate() – вызывается после того, как отработают все Update(). Отлично подходит для камеры: сначала в Update() персонаж переместился, а затем в LateUpdate() камера плавно за ним последовала.

Простая аналогия:

  • Update(): Игрок нажал кнопку "прыгнуть".
  • FixedUpdate(): Физический движок просчитал траекторию прыжка.
  • LateUpdate(): Камера обновила свою позицию, чтобы летящий игрок оставался в центре экрана.

6. Итог и домашнее задание

Кратко:

  • Update() – главный цикл игры, который вызывается каждый кадр.
  • В него помещаем всё, что должно обновляться в реальном времени (ввод, движение, логика).
  • Всегда используйте Time.deltaTime для плавного и стабильного движения.

Домашнее задание:
Создай новый куб в сцене, накинь на него этот скрипт и проверь! Попробуй изменить переменную speed прямо в инспекторе Unity (она же public) и посмотри, как меняется поведение. Попробуй убрать * Time.deltaTime и увидишь разницу на собственной шкуре!

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

P.S.- В одном из следующих постов мы подробно разберем FixedUpdate() и поговорим о физике в Unity.