본문 바로가기
Unity

Awake()와 Start()의 차이

by 호아나트 2022. 7. 25.
반응형

개요

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

댓글