Хорошо, давайте откроем ящик Пандоры о методах волхвов c в Unity.
Во-первых, есть два типа классов, от которых вы можете наследовать, для доступа к методам магов c: MonoBehaviour
и ScriptableObject
. Оба они предлагают разные вещи, и последний в основном используется для сериализации данных вне сцены. Кроме того, ScriptableObject
имеет намного меньше магических c методов, чем MonoBehaviour.
Второе: у MonoBehaviour
есть жизненный цикл. От того, где вы находитесь в этом жизненном цикле, зависит, какие методы вызываются механизмом.
На следующем графике c показан весь жизненный цикл MonoBehaviour
:
(Источник: Unity - Manual: Порядок выполнения для функций событий )
Как видите, объект создается и вызывается Awake
. Перед первым вызовом Update
механизм вызывает метод Start
. Существует разница между Awake
и Start
: Awake
сопоставима с конструктором. Он вызывается без каких-либо внешних гарантий (как и другие компоненты вашего GameObject
). Когда вызывается Start
, все остальные компоненты объекта инициализируются и могут быть доступны с помощью вызова GetComponent
.
Теперь Update
, FixedUpdate
и всех других событий:
Unity имеет два отдельных цикла, которые он повторяет. Один для физики и один для всего остального. Поскольку вычисление физики стоит дорого и требует точности, оно вызывается с фиксированными, четкими временными шагами. Вы действительно можете установить их в настройках проекта на вкладке «Время» .
Теперь, если вы хотите изменить что-либо, связанное с физикой (например, скорость твердого тела), вы должны сделать это в FixedUpdate
, потому что он работает на том же временном шаге, что и физический движок (PhysX или Box2D, в зависимости от того, как вы используете коллайдеры).
С другой стороны, обновление выполняется как можно чаще. Текущее временное расстояние между двумя вызовами Обновления можно узнать, набрав Time.deltaTime
, то есть время, которое проходит между двумя вызовами Update
. Обратите внимание, что Time.fixedDeltaTime
всегда одинаково, так как это время между двумя физическими вызовами.
Другие методы событий вызываются как ответы либо на внутреннее обновление редактора l oop, либо на рендеринг l oop, либо на физика l oop. Всякий раз, когда объект сталкивается в физическом расчете, вызывается OnCollisionEnter
. Обратите внимание, что это не может произойти из Update
, потому что, как мы знаем, Update
не используется для вычисления физики.
Хорошо, тл; dr:
Start
и Update
- не единственные методы, которые существуют в жизненном цикле MonoBehaviour
, их много, и у каждого есть своя цель. Физика рассчитывается в другом масштабе времени при вызове метода Update
и, следовательно, не может быть частью Update
.
И одна вещь, которую нужно отнять: вы должны действительно прочитать руководство по игре двигатель, который вы используете. Есть много вещей, которые вы должны знать, когда пишете код для приложения реального времени, и если вы строите на существующем игровом движке, вы должны регулярно проверять документы по этому. В частности, документация по Unity очень хорошо читается как для кода, так и для использования редактором.