Study/Unity

Awake / OnEnable / Start의 차이

해달 2022. 7. 17. 14:36

개요

초기화를 목적으로 제공되는 Unity 이벤트는 아래와 같이 3가지가 있다.

  • Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.
  • OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다.
  • Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다.

하지만, 이 3가지에 대해서 차이점을 모른다면 적절하게 초기화를 못할 수도 있다. 이 글에서는 간단한 테스트와 함께 Awake / OnEnable / Start이 전달되는 시점을 정확히 알고자 한다.

테스트

먼저 아래와 같은 스크립트를 작성한다.

 

public class Test : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Awake");
    }


    void OnEnable()
    {
        Debug.Log("OnEnable");    
    }


    void Start()
    {
        Debug.Log("Start");
    }
}

 

그리고 빈 게임 오브젝트를 만들어 부착한다.

 

그리고 크게 게임 오브젝트가 씬 로드 전에 활성화 되어 있는 경우와 되어 있지 않은 경우로 나눠 테스트를 해보자.

 

1. Scene 로드 전 게임 오브젝트가 활성화 된 경우

스크립트가 활성화 되어 있을 때는 아래와 같은 결과를 얻게 된다.

 

스크립트가 비활성화 되어 있을 때는 아래와 같은 결과를 얻게 된다.

이 상태에서 중간에 활성화가 되면 아래와 같은 결과를 얻는다.

 

2. Scene 로드 전 게임 오브젝트가 비활성화 된 경우

게임 오브젝트와 스크립트를 모두 비활성화 시키고 실행해보면 아래와 같은 결과를 얻는다.

아무런 로그도 볼 수 없다. 이 상태에서 스크립트만 활성화 해도 똑같은 결과를 얻는다. 그럼 다시 스크립트를 비활성화한 상태에서 게임 오브젝트만 활성화한다.

스크립트가 비활성화된 상태임에도 불구하고 Awake 메시지가 전달됐음을 알 수 있다. 이 상태에서 스크립트까지 활성화하면 아래와 같은 결과를 얻는다.

결론

위 결과를 바탕으로 Awake / OnEnable / Start의 호출 시점을 정리하면 아래와 같다.

  • Awake : 스크립트가 비활성화 되어 있더라도 게임 오브젝트가 활성화 되어 있으면 무조건 호출된다.
  • OnEnable : 게임 오브젝트가 활성화 된 경우에만 게임 오브젝트 혹은 스크립트가 비활성화된 상태에서 활성화될 때 호출된다.
  • Start : 게임 오브젝트와 스크립트 모두 활성화된 경우에만 호출된다.

 

이러한 차이점을 명확히 알고 적절하게 사용하도록 하자.

 

'Study > Unity' 카테고리의 다른 글

Unity에 싱글톤(Singleton) 패턴 적용하기  (0) 2022.07.17