팀 프로젝트를 진행하면서 전부 Start() 함수에 초기 코드를 작성했었습니다.
하지만 가끔씩 NullReferenceException이 터졌습니다.
이 때 이유는 제대로 알아보지 못하고 Awake()를 사용해서 해결을 했었습니다.
이번 기회에 두 개의 차이점을 제대로 알고 동일한 문제가 발생 했을 때,
원인을 제대로 파악하고 해결하기 위해 이렇게 작성해봤습니다.
항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다.
게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.
<Unity Docs>
예제 코드
using UnityEngine;
public class GameClass : MonoBehaviour
{
private GameObject _player;
void Awake()
{
_player = GameObject.FindWithTag("Player");
}
}
스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다.
<Unity Docs>
예제 코드
using UnityEngine;
public class GameClass : MonoBehaviour
{
private GameObject update;
void Start()
{
_player = GameObject.FindWithTag("Player");
}
}
Start()와 Awake()가 무엇인지 정리해봤습니다.
이번에는 둘의 차이점을 정리해서 어떤 상황에서 사용하면 좋을지 알아보았습니다.
*위 이미지는 유니티의 이벤트 실행 순서를 표로 나타낸 것입니다.
Awake는 다른 개체가 초기화 된 후에 호출되기 때문에, 다른 컴포넌트에 대한 참조를 만들 경우에 사용하면 좋은 방법입니다. 스크립트와 컴포넌트 사이에 초기 참조를 생성하기 위해 사용하면 좋습니다.
하지만 모든 객체의 Awake 함수는 무작위로 호출됩니다.
그래서 한 객체의 Awake가 다른 객체보다 먼저 호출되거나 Awake에서 생성한 참조가 Awake의 다른 스크립트에서 사용할 수 있다고 보장할 수 없습니다.
차이점을 정리해보면 아래와 같습니다.
Awake가 Start보다 먼저 실행된다는 차이점만 알고 있었습니다.
하지만 이런 수준의 내용만 인지하고 프로젝트의 규모가 점점 커질수록 문제가 참조에 대한 문제가 발생할 경우 빠르게 대처하지 못했습니다.
이번에 차이점과 개념을 공부하면서 Awake는 언제 호출이 되고 Start는 언제 호출이 안되는지 알게 되었습니다.