Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
프로젝트 중에 Awake()와 Start()의 차이를 제대로 인지하지 못하여 발생한 오류에 대해 설명해 보겠다.
일단 MonoBehaviour.Awake() 와 MonoBehaviour.Start()는 위와 같은 순서를 가진다.
빈번히 사용하는 Update()와 달리 Awake()와 Start()는 Initalization 구역으로 스크립트의 초기화에 이용된다.
단, 호출의 순서는 Awake() -> Start()로 Awake()가 먼저 호출되는데,
둘의 차이는 Awake는 모든 오브젝트가 초기화되고 호출되고, Start는 스크립트 인스턴스가 활성화된 경우에만 호출된다는 점이다.
간단히 말하면, Awake는 항상 Start 함수의 이전 및 프리팹의 인스턴스화 직후에 호출
Start는 첫 번째 프레임의 업데이트 전에 Start가 호출된다.
만약 Start만으로 모든 스크립트를 초기화한다고 생각해보자.
UnitA와 EnemyA에게 적용한 스크립트가 각각 다르고 유닛들을 관리하는 Controller의 Start에서 각 유닛을 Instantiate()하고 스크립트 정보를 컴포넌트로 가져온다고 생각해보자.
Controller가 각 유닛을 인스턴스화 하기 때문에 가장 먼저 호출되는 Start는 Controller의 start이다.
두 유닛을 소환한다면 두 유닛의 Start는 Controller의 start가 끝나고 호출될까? 아니면 먼저 호출될까?
경험해본 바로는 Controller의 start가 먼저 실행되는 것 같지만, 순서는 확정할 수 없을 것 같다.
본인의 경우는 결국 Controller의 Start는 자신이 인스턴스화한 유닛의 스크립트들이 start로 초기화된 정보가 없기 때문에 nullreference오류를 발생시켰다.
이런 경우와 같이 스크립트간의 참조를 설정을 하기 위해서는 Awake()를 사용해주어야 한다.
Awake는 모든 오브젝트가 초기화되고 호출되기 때문에 다른 스크립트와 연결을 보장할 수 있다.
다른 스크립트들을 많이 참조하는 프로젝트일수록 Awake()의 사용을 권장해야 할 것 같다.
이렇게만 보면 Start를 굳이 사용해야 하나 생각이 들긴하는데, 모든 초기화가 끝난 후 다음 순서로 실행할 필요가 있는 작업에는 Start를 사용해보면 편할 듯하다.
출처
https://docs.unity3d.com/kr/530/ScriptReference/MonoBehaviour.Awake.html
https://docs.unity3d.com/kr/530/ScriptReference/MonoBehaviour.Start.html
'개발 > Unity' 카테고리의 다른 글
[Unity] 유니티에서 테스트 주도 개발(TDD) 적용하기 (0) | 2022.04.17 |
---|---|
[유니티] IPointerHandler 인터페이스가 작동하지 않는 이유 (0) | 2022.03.07 |
[Unity] C# enum(열거형) 활용하기 (0) | 2022.02.08 |
[유니티] Coroutine으로 Update 대체하기 (Update 최적화) (0) | 2022.01.18 |
[Unity] 유니티에서의 다중 상속과 다이아몬드 문제 (2) | 2022.01.05 |