유니티 생명주기란?
유니티 C# 스크립트는 MonoBehaviour라는 클래스를 상속받는다. 이 스크립트 컴포넌트를 상속 받은 오브젝트는 유니티 프레임워크에 사전에 지정된 순서에 따라 함수를 호출하는데, 이것을 유니티의 생명 주기라고 한다.
MonoBehaviour Flowchart
개별 이벤트들 보기
Awake
스크립트가 호출될 때 한 번만 호출되는 이벤트.
컴포넌트 또는 오브젝트가 비활성화되어 있는 상태에서도 호출된다.
단, 오브젝트나 컴포넌트가 비활성화/재활성화되거나 다시 컴파일되는 경우에는 호출되지 않는다.
OnEnable
활성화된 오브젝트의 컴포넌트가 활성화될 때 호출됨.
- 레벨 로드
- 스크립트를 포함한 오브젝트 Instantiate
와 같은 상황에서 호출된다.
Start
컴포넌트가 활성화된 경우에만 첫프레임 업데이트 전에 호출된다.
오브젝트나 컴포넌트가 비활성화/재활성화되거나 다시 컴파일되는 경우에는 호출되지 않는다.
원래의 오브젝트가 게임플레이 도중 인스턴스화될 때는 호출되지 않는다.
FixedUpdate
- 고정된 주기마다 호출되는 이벤트. (default 50Hz, Project Settings > Time > Fixed Timestep)
- Time.deltaTime 이 Fixed Timestep을 반환 (default 0.02)
- 물리적 이벤트, 게임플레이, AI 등을 다루는 코드는 Update에서 호출.
- 모든 물리 계산은 FixedUpdate 호출 이후에 발생한다.
Update
- 프레임 당 한 번 호출되는 함수.
- 컴포넌트 활성화되어 있어야 한다.
- input, 시각 효과, UI, audio 등을 다루는 코드는 Update에서 호출.
- Time.deltaTime은 프레임 사이 간격을 반환한다.
LateUpdate
Update 끝난 이후 프레임 당 1번 호출된다.
- Update 에서 수행된 모든 계산은 LateUpdate 호출 시점에는 이미 완료되어 있다.
- 주로 카메라를 이동시키는 용도로 사용.
FixedUpdate와 Update 사이에서 호출되는 이벤트
OnTriggerXXX
- 물리적 상호작용 처리 시에 호출.
- Collider에 trigger 모드 설정된 경우에만 호출.
- 단순 감지.
- rigidbody로 접촉 일어났을 때 호출.
OnCollisionXXX
- 물리적 충돌 처리에 사용.
- Collider에 trigger 모드 설정 안된 경우에만 호출.
- rigidbody로 접촉 일어났을 때 호출.
렌더링
- OnPreCull: 카메라가 씬을 컬링하기 전에 호출됨. 컬링은 어떤 오브젝트를 카메라에 표시할지 결정합니다. OnPreCull은 컬링 발생 직전에 호출됩니다.
- OnBecameVisible/OnBecameInvisible: 오브젝트가 카메라에 표시되거나/표시되지 않을 때 호출된다.
- OnWillRenderObject: 오브젝트가 표시되면 각 카메라에 한 번 호출된다.
- OnPreRender: 카메라가 씬 렌더링을 시작하기 전에 호출된다.
- OnRenderObject: 모든 일반 씬 렌더링이 처리된 후 호출된다. 이 때 커스텀 지오메트리를 그리는 데에 GL 클래스 또는 Graphics.DrawMeshNow를 사용할 수 있다.
- OnPostRender: 카메라가 씬 렌더링을 마친 후 호출된다.
- OnRenderImage: 씬 렌더링이 완료된 후 호출되어 이미지의 포스트 프로세싱이 가능.
- OnGUI: GUI 이벤트에 따라 프레임당 여러 번 호출된다.
- 레이아웃 및 리페인트 이벤트 우선 처리.
- 입력 이벤트에 대해 레이아웃 및 키보드/마우스 이벤트 처리.
- OnDrawGizmos: 시각화 목적으로 씬 뷰에 기즈모를 그릴 때 사용된다.
OnDisable
컴포넌트나 오브젝트가 비활성화될 때 호출된다.
OnDestroy
컴포넌트가 GameObject에서 삭제되거나 GameObject가 destroy될 때 호출된다.
참고 자료
이벤트 함수의 실행 순서
a-comprehensive-guide-to-the-execution-order-of-unity-event-functions