Idle и Physics Processing

Игры работают в цикле. В каждом кадре необходимо обновлять состояние игрового мира перед его отображением на экране. Godot предоставляет для этого два виртуальных метода в классе Node: Node._process() и Node._physics_process(). Если вы определите один или оба метода в скрипте, движок вызовет их автоматически.

Существует два типа обработки, которые доступны вам:

  1. Idle processing позволяет вам запускать код, который обновляет узел каждый кадр, так часто, как это возможно.

  2. Physics processing происходит с фиксированной скоростью, 60 раз в секунду по умолчанию. Это не зависит от фактической частоты кадров в вашей игре и обеспечивает бесперебойную обработку физики. Вы должны использовать это для всего, что предполагает использование физического движка, как например движение тел, которые сталкиваются с окружением.

Вы можете активировать обработку простоя, определив метод _process() в скрипте. Вы можете отключить и включить его, вызвав Node.set_process().

Движок вызывает этот метод каждый раз при отрисовке кадра:

func _process(delta):
    # Do something...
    pass

Помните, что частота, с которой движок вызывает _process(), зависит от частоты кадров вашего приложения, которая меняется со временем и на разных устройствах.

Параметр delta функции — это время в секундах, прошедшее с момента предыдущего вызова _process(). Используйте этот параметр, чтобы вычисления не зависели от частоты кадров. Например, для анимации движущегося объекта всегда следует умножать значение скорости на delta.

Обработка физики работает с помощью аналогичной виртуальной функции: _physics_process(). Используйте её для вычислений, которые должны происходить перед каждым шагом физики, например, для перемещения персонажа, который сталкивается с игровым миром. Как упоминалось выше, _physics_process() выполняется с фиксированными временными интервалами, насколько это возможно, чтобы сохранить стабильность физических взаимодействий. Вы можете изменить интервал между шагами физики в Настройках проекта, в разделе Physics -> Common -> Physics Fps По умолчанию он установлен на 60 раз в секунду.

Движок вызывает этот метод перед каждым шагом физики:

func _physics_process(delta):
    # Do something...
    pass

Функция _process() не синхронизирована с физикой. Её скорость зависит от аппаратного обеспечения и оптимизации игры. Она также выполняется после этапа обработки физики в однопоточных играх.

Вы можете увидеть функцию _process() в работе, создав сцену с одним узлом Label и прикрепив к нему следующий скрипт:

extends Label

var time = 0

func _process(delta):
    time += delta
    text = str(time) # 'text' is a built-in Label property.

При запуске сцены вы должны увидеть, как счетчик увеличивается с каждым кадром.