개요
초기화를 목적으로 제공되는 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 System Programming Pt.1] 7-8주차 - 유저 인벤토리 구현 (1) | 2024.10.30 |
---|---|
UI 이벤트 메소드를 연결 전에 잘 살펴봐야 하는 이유 (0) | 2024.10.29 |
[Unity System Programming Pt.1] 2주차 (5) | 2024.09.24 |
[Unity System Programming Pt.1] 1주차 (7) | 2024.09.10 |
Unity에 싱글톤(Singleton) 패턴 적용하기 (0) | 2022.07.17 |