빈번히 사용하는 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를 사용해보면 편할 듯하다.
'C#' 카테고리의 다른 글
[C#][Unity] 로그 찍기 (0) | 2022.11.01 |
---|---|
[C#][Unity] 클릭으로 2D 오브젝트 제거하기 (0) | 2022.10.29 |
[C#][Unity] 2D 오브젝트 화살표로 강조표시 (0) | 2022.10.16 |
[C#][Unity] 2D 캐릭터 이동시 현재방향 저장 (0) | 2022.10.14 |
[C#][Unity] 중력 조절 (0) | 2022.10.01 |