Разница между кэшированием компонента GetComponent в Awake и Start?

Есть ли какая-либо разница между получения компонента в Awake и Start, влияющая на запуск и производительность. Есть ли вообще смысл об этом думать?

Насколько я знаю, Start вызывается позже Awake, что навело меня на мысль, что уж легче наверное получить и узнать обо всех компонентах, до начала основного Update, чем напрягать движок перед отрисовкой первого кадра, как собственно это делает Start. Сейчас использую GetComponent только в Awake, так как он выполняется самым первым.

Заблуждаюсь ли я, и есть ли какие-то последствия моего решения?


Ответы (1 шт):

Автор решения: Максим Фисман

Существует разница между Awake и Start.

Awake

  • Вызывается единожды за все время жизни скрипта
  • Вызывается, когда загружается экземпляр скрипта на объекте
  • Вызывается сразу, как только объект стал активным (при старте игры или при активации объекта) вне зависимости от того, активен ли сам скрипт.
  • Вызывается, когда все объекты на сцене уже проинициализированы, поэтому можно безопасно вызывать GetComponent'ы, GameObject.FindWithTag'и и т.п.
  • Может быть использован как конструктор

Start

  • Вызывается единожды за все время жизни скрипта
  • Вызывается сразу, как только компонент стал активным (enabled), поэтому может быть вызван не в один кадр с Awake)
  • Любой Start вызывается после всех Awake, так что если объекту A нужно что-то получить от В, то инициализация B должна быть в Awake, а A - в Start
  • Start, в отличие от Awake, может быть корутиной:
    private IEnumerator Start()
    {
        print("Before"); 
        yield return new WaitForSeconds(5); // Задержка
        print("After");
    }

Таким образом кэширование компонентов может производиться в обеих функциях в зависимости от ваших требований. Следует помнить, что при кэшировании компонентов в Awake или Start хорошей практикой будет добавлять скрипту аттрибут [RequireComponent]

→ Ссылка