개요
Awake(), Start()는 MonoBehaviour에서 파생된 클래스의 이벤트 함수이다.
기본적으로 Awake()→Start()로 진행되며 초기화와 관련이 있다는 것은 모두 알고 있을 것이다.
그렇다면 Awake(), Start()함수들이 한 번에 사용해도 되는데 왜 구분을 하였을까?
차이점부터 알아보자.
Awake()와 Start()의 차이
Awake()는 해당 스크립트가 있는 오브젝트가 초기화 될 때 호출된다.
Start()는 Update가 실행되기 전 첫 프레임에 호출된다.
초기화를 위해서 Awake()만 실행하면 되지 않을까 생각되지만 그렇지 않은 이유가 있다.
컴포넌트 참조 문제
Awake는 실행이 될 때, 각 오브젝트들의 Awake()가 언제 실행될지 모른다. Awake()에서 참조한 오브젝트를 다른 스크립트의 Awake()에서 참조하려고 한다면 에러가 날 수가 있다.
//Target을 참조한 스크립트1
public class InitiateTarget : MonoBehaviour
{
public Target target;
private void Awake()
{
target = GetComponent<Target>();
}
...
//스크립트1에서 초기화한 인스턴스의 필드 target을 참조.
public class InitiateInOtherScript : MonoBehaviour
{
public InitiateTarget initiateTarget;
public Target target;
private void Awake()
{
initiateTarget = GameObject.FindWithTag("Target").GetComponent<InitiateTarget>();
Debug.Log(initiateTarget.name);
target = initiateTarget.target;
Debug.Log(target.GetType());
}
...
InitiaiteInOtherScript의 target이 참조를 못한다는 에러 문구가 띄어있는 것을 볼 수 있다.
초기화 함수들을 구분해서 사용하는 이유를 알 수 있다.
Awake()의 사용은 오브젝트 내에 있는 컴포넌트 참조 및 변수 초기화를 하면 된다.
이후 Start()에서 다른 객체나 다른 객체가 가진 컴포넌트를 참조하는 방식을 하는 방식으로 사용하면 된다.
비활성화와 활성화
Awake()는 Start()와 달리 스크립트가 비활성화 상태여도 실행된다는 점이다.
코루틴
Awake()는 Start()와 달리 코루틴으로 사용할 수 없다.
결론
Awake()와 Start()는 같은 초기화 함수라고 생각하고 서로 구분 없이 썼었다. 물론 문제가 생기면, 에러를 제거하는데 집중한 것 같다.
이번 계기는 해당 함수들의 사용 방법과 예전에 생겼던 에러들이 왜 생기게 되었는지 고찰을 해볼 수 있는 계기가 되었다.
'Unity' 카테고리의 다른 글
Physcis.CheckBox와 OnTriggerEnter (0) | 2022.06.10 |
---|
댓글