24.08.19 Unity_C# - 생명주기(Awake vs Start, Update 등 )
유니티 생명 주기
Unity의 생명주기는 유니티 엔진의 게임 개발 과정에서 매우 중요한 개념입니다.
게임 오브젝트가 생성되어 화면에 나타나고, 게임이 진행되어 오브젝트가 사라지기까지의 일련의 과정을 의미합니다.
* MonoBehaviour 클래스는 게임 오브젝트의 동작을 정의하는 기본 클래스입니다. 이 클래스의 여러 메서드들은 Unity의 생명 주기를 통해 자동으로 호출됩니다.
Awake vs Start
둘 다 클래스의 초기화에 사용되는 이벤트 함수로 호출 시기에 따른 차이가 있습니다.
Awake
- 스크립트와 연결된 GameObject가 인스턴스화되거나, 스크립트가 처음 로드 될 때 호출된다.
- 해당 오브젝트가 Enable 상태가 아니라고 해도 위 조건에 따라 로드되면 호출된다.
- 다른 오브젝트에 대한 참조를 생성할 때 주로 생성하게 된다. (GameObject.Find, GetComponent, FindObjectOfType 등)
-- 단 Awake 호출은 무작위. (여러 개의 스크립트가 있는 경우 각 스크립트에서 'Awake' 메서드가 실행되는 순서 보장 x)
-- 무작위성으로 인해 다른 스크립트의 참조를 통해 접근을 하면 NullReferenceException이 발생하게 된다.
Start
- 해당 스크립트 컴포넌트가 활성화되는 순간 호출된다.
- 호출 시기는 Awake보단 느리게 첫 Update 보단 빠르게 호출된다.
- Start에서는 참조를 통해 접근하는 작업이 가능하다.
OnEnable vs Start
둘 다 '컴포넌트가 활성화 될 때' 불린다는 공통점이 있어 묶이게 되지만 Start는 한 번, OnEnable은 활성화 될 때 마다 불리게 된다는 차이점이 있습니다. 때문에 초기화 작업에 OnEnable을 활용하면 안됩니다. OnEnable은 주로 오브젝트 풀링에 사용하게 되는 함수라고 볼 수 있습니다.
Update vs FixedUpdate vs LateUpdate
- Update : 프레임 단위로 호출된다.
- FixedUpdate : 고정 단위로 불리게 되는 함수
- LateUpdate : Update 호출 뒤 불리게 된다.
FixedUpdate는 매 함수 호출 간격이 다른 Update와는 달리 호출 간격이 일정합니다. 따라서 매번 일정한 주기로 똑같은 연산을 처리해야하는 물리 계산인 Rigidbody에 주로 사용됩니다.
LateUpdate는 Update 함수 호출 뒤 불리기 때문에 주로 카메라의 움직임에 사용됩니다.