Subtelna, ale jest…

Dziedzicząc po klasie MonoBehaviour mamy do dyspozycji dwie metody: Awake() oraz Start(). Gdyby porównać je bez zagłębiania się w szczegóły to obie wołane są tylko raz w cyklu życia skryptu, na jego początku, przed pierwszym wywołaniem Update().  Obie możemy wykorzystać do inicjalizacji zmiennych, przygotowania mapy dla gracza, czy wygenerowania innych obiektów. I pewnie w prostych, szkoleniowych projektach, można by przymknąć oko i potraktować je jak identyczne. Mimo to, różnica jest, warto ją znać i wykorzystywać na swoją korzyść.

Żeby wystartować, trzeba się obudzić

Awake() wołane jest wcześniej niż Start(). Konkretnie, kiedy instancja skryptu jest ładowana do pamięci, ale już po utworzeniu wszystkich obiektów na scenie. Możemy więc bez problemów odwoływać się do obiektu gracza, GUI, tekstur, co tam sobie w edytorze dodamy i będzie istniało w momencie uruchomienia gry.

Start() wołana jest po tym jak wszystkie metody Awake() na scenie zakończą swoje działanie. Możemy to wykorzystać, jeśli inicjalizacja danego skryptu jest zależna od danych dostarczonych z innego skryptu. Wtedy pierwszy inicjujemy za pomocą Awake(), a drugi za pomocą Start().

Awake i Start w punktach

Awake():

  • Wołana raz w cyklu życia skryptu
  • Wołana po zakończeniu tworzenia wszystkich obiektów na scenie
  • Wołana przed pierwszym przebiegiem metody Update()
  • Może być używana w charakterze konstruktora
  • Nie może być wołana jako korutyna
  • Nie mamy kontroli nad kolejnością wołania Awake() dla poszczególnych skryptów

Start():

  • Wołana raz w cyklu życia skryptu
  • Wołana po zakończeniu wszystkich metod Awake() na scenie
  • Wołana przed pierwszym przebiegiem metody Update()
  • Może, ale nie musi być wywołana w tej samej klatce co Awake()