Разница между кэшированием компонента 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]