[Unity] Awake()와 Start()의 차이

Arthur·2023년 10월 17일
0
post-thumbnail

작성하게 된 계기


팀 프로젝트를 진행하면서 전부 Start() 함수에 초기 코드를 작성했었습니다.
하지만 가끔씩 NullReferenceException이 터졌습니다.

이 때 이유는 제대로 알아보지 못하고 Awake()를 사용해서 해결을 했었습니다.

이번 기회에 두 개의 차이점을 제대로 알고 동일한 문제가 발생 했을 때,
원인을 제대로 파악하고 해결하기 위해 이렇게 작성해봤습니다.



Awake()란?


항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다.
게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.
<Unity Docs>

예제 코드

using UnityEngine;

public class GameClass : MonoBehaviour
{
    private GameObject _player;

    void Awake()
    {
        _player = GameObject.FindWithTag("Player");
    }
}
  • 스크립트간의 참조를 설정을 하기 위해서는 Awake()를 사용해주어야 한다.
  • Awake는 모든 오브젝트가 초기화되고 호출되기 때문에 다른 스크립트와 연결을 보장할 수 있다.
  • 유니티에서 MonoBehaviour를 상속 받은 클래스에서 사용이 가능합니다.
  • Awake 함수는 객체의 Start 함수가 호출되기 전에 Scene(씬)의 모든 객체에 대해 호출됩니다.


Start()란?


스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다.
<Unity Docs>

예제 코드

using UnityEngine;

public class GameClass : MonoBehaviour
{
    private GameObject update;

    void Start()
    {
    	_player = GameObject.FindWithTag("Player");
    }
}
  • Awake 함수와 마찬가지로 Start는 스크립트 수명 동안 한 번 호출됩니다.
    • 반대로 Awake는 스크립트 활성화 여부에 관계 없이 스크립트 개체가 초기화될 때 호출됩니다.
  • Awake와 동일하게 MonoBehaviour를 상속 받은 클래스에서 사용이 가능합니다.
  • 씬 에셋에 포함된 모든 오브젝트에 대해 Update 등 이전에 호출된 모든 스크립트를 위한 Start 함수가 호출됩니다.
    • 게임플레이 도중 오브젝트를 인스턴스화될 때는 실행되지 않습니다.

Start()와 Awake()가 무엇인지 정리해봤습니다.
이번에는 둘의 차이점을 정리해서 어떤 상황에서 사용하면 좋을지 알아보았습니다.



Start()와 Awake()의 차이


*위 이미지는 유니티의 이벤트 실행 순서를 표로 나타낸 것입니다.

Awake는 다른 개체가 초기화 된 후에 호출되기 때문에, 다른 컴포넌트에 대한 참조를 만들 경우에 사용하면 좋은 방법입니다. 스크립트와 컴포넌트 사이에 초기 참조를 생성하기 위해 사용하면 좋습니다.

하지만 모든 객체의 Awake 함수는 무작위로 호출됩니다.
그래서 한 객체의 Awake가 다른 객체보다 먼저 호출되거나 Awake에서 생성한 참조가 Awake의 다른 스크립트에서 사용할 수 있다고 보장할 수 없습니다.

차이점을 정리해보면 아래와 같습니다.

  • Awake와 Start의 가장 큰 차이는 실행되는 순서가 다르다는 것입니다.
  • Awake는 스크립트 활성화 여부 관계 없이 스크립트 개체가 초기화될 때 호출됩니다.
    • 비활성화 상태에서도 Awake는 호출이 되지만 Start는 호출되지 않습니다.
  • Awake는 모든 오브젝트가 초기화되고 호출되기 때문에 다른 스크립트와 연결을 보장할 수 있다.
  • Start는 게임플레이 도중 오브젝트를 인스턴스화될 때는 실행되지 않습니다.


작성하면서 느낀 점


Awake가 Start보다 먼저 실행된다는 차이점만 알고 있었습니다.
하지만 이런 수준의 내용만 인지하고 프로젝트의 규모가 점점 커질수록 문제가 참조에 대한 문제가 발생할 경우 빠르게 대처하지 못했습니다.

이번에 차이점과 개념을 공부하면서 Awake는 언제 호출이 되고 Start는 언제 호출이 안되는지 알게 되었습니다.



참고 자료


  • [C#][Unity] Awake와 Start의 차이 => 링크
  • Start vs Awake in Unity => 링크
  • Unity Docs - 이벤트 함수 실행 순서(Execution Order of Event Functions) => 링크
  • Unity Docs - MonoBehaviour.Awake() => 링크
  • Unity Docs - MonoBehaviour.Start() => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글