이벤트 함수 실행 순서(Execution Order of Event Functions)
Unity 이벤트 함수는 사전에 정해진 순서대로 실행됩니다. 실행 순서는 다음과 같습니다.
에디터
- Reset: 오브젝트에 처음 연결하거나 Reset 커맨드를 사용할 때 스크립트의 프로퍼티를 초기화하기 위해 Reset을 호출합니다.
첫 번째 씬 로드
다음 함수는 씬이 시작할 때(씬에서 오브젝트마다 한 번) 호출됩니다.
- Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.
- OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다.
- OnLevelWasLoaded: 이 함수는 세 레벨이 로드된 게임을 통지하기 위해 실행됩니다.
씬에 추가된 모든 오브젝트에 대해 Start, Update 등 이전에 호출된 모든 스크립트를 위한 Awake 및 OnEnable 함수가 호출됩니다.
원래 오브젝트가 게임플레이 도중 인스턴스화될 때 실행되지 않습니다.
[첨부]
(오브젝트 두개 A, B 추가해 놓고 각각 다른 스크립트를 붙여 놓은 후 awake, onenable, start 실행 순서의 관계를 보면 Awake 와 OnEnalbe 의 경우
동일한 오브젝트의 Awake 와 OnEnalbe 이 호출되는 순서를 보인다,
즉 A 오브젝트에 붙인 스크립트에 Awake ,가 호출된 후 OnEnalbe 이호출 되고
B 오브젝트에 붙인 스크립트에 Awake ,가 호출된 후 OnEnalbe 이호출 되는 Awake 와 OnEnable 의 세트적인? 경향을 보이고 다음
Awake 와 OnEnalbe 의 호출이 다른 오브젝트 들에서 모두 완료 된 이후에 각각 한번씩 Start 함수가 호출되기 시작한다
첫 번째 프레임 업데이트 전에
- Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다.
씬에 추가된 모든 오브젝트에 대해 Update 등 이전에 호출된 모든 스크립트를 위한 Start 함수가 호출됩니다. 원래 오브젝트가 게임플레이 도중 인스턴스화될 때 실행되지 않습니다.
프레임 사이
- OnApplicationPause: 이 함수는 일시 정지가 감지된 프레임의 끝, 실질적으로는 일반 프레임 업데이트 사이에 호출됩니다. 게임에 일시정지 상태를 가리키는 그래픽스를 표시하도록 OnApplicationPause 가 호출된 후에 한 프레임이 추가로 실행됩니다.
업데이트 순서
게임 로직, 상호작용, 애니메이션, 카메라 포지션의 트랙을 유지할 때, 사용 가능한 몇몇 다른 이벤트가 존재합니다. 일반적인 패턴은 Update 함수에 대부분의 작업을 수행하는 것이지만, 사용할 수 있는 다른 함수도 있습니다.
FixedUpdate: FixedUpdate 는 종종 Update 보다 더 자주 호출됩니다. 프레임 속도가 낮은 경우 프레임당 여러 번 호출될 수 있으며 프레임 속도가 높은 경우 프레임 사이에 호출되지 않을 수 있습니다. 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다. FixedUpdate 의 움직임 계산을 적용할 때 Time.deltaTime 만큼 값을 곱할 필요가 없습니다. FixedUpdate 가 프레임 속도와 관계없이 신뢰할 수있는 타이머에서 호출되기 때문입니다.
Update: Update 는 프레임당 한 번 호출됩니다. 프레임 업데이트를 위한 주요 작업 함수입니다.
LateUpdate: LateUpdate 는 Update 가 끝난 후 프레임당 한 번 호출됩니다. Update 에서 수행된 모든 계산은 LateUpdate 가 시작할 때 완료됩니다. LateUpdate 는 일반적으로 다음의 3인칭 카메라에 사용합니다. 캐릭터를 움직이고 Update 로 방향을 바꾸게 하는 경우 LateUpdate 에서 모든 카메라 움직임과 로테이션 계산을 수행할 수 있습니다. 이렇게 하면 카메라가 포지션을 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있습니다.
렌더링
- OnPreCull: 카메라가 씬을 컬링하기 전에 호출됩니다. 컬링은 어떤 오브젝트를 카메라에 표시할지 결정합니다. OnPreCull은 컬링 발생 직전에 호출됩니다.
- OnBecameVisible/OnBecameInvisible: 오브젝트가 카메라에 표시되거나/표시되지 않을 때 호출됩니다.
- OnWillRenderObject: 오브젝트가 표시되면 각 카메라에 한 번 호출됩니다.
- OnPreRender: 카메라가 씬 렌더링을 시작하기 전에 호출됩니다.
- OnRenderObject: 모든 일반 씬 렌더링이 처리된 후 호출됩니다. 이 때 커스텀 지오메트리를 그리는 데에 GL 클래스 또는 Graphics.DrawMeshNow를 사용할 수 있습니다.
- OnPostRender: 카메라가 씬 렌더링을 마친 후 호출됩니다.
- OnRenderImage: Called after scene rendering is complete to allow post-processing of the image, see Post-processing Effects.
- OnGUI: GUI 이벤트에 따라 프레임당 여러 번 호출됩니다. 레이아웃 및 리페인트 이벤트는 우선 처리되며 각 입력 이벤트에 대해 레이아웃 및 키보드/마우스 이벤트가 다음으로 처리됩니다.
- OnDrawGizmos: 시각화 목적으로 씬 뷰에 기즈모를 그릴 때 사용됩니다.
코루틴
일반적인 코루틴 업데이트는 Update 함수가 반환된 후 실행됩니다. 코루틴은 주어진 YieldInstruction이 완료될 때까지 실행을 중단(양보)할 수 있는 함수입니다. 코루틴의 다른 사용법은 다음과 같습니다.
- yield 코루틴은 모든 Update 함수가 다음 프레임에 호출된 후 계속됩니다.
- yield WaitForSeconds 지정한 시간이 지난 후, 모든 Update 함수가 프레임에 호출된 후 계속됩니다.
- yield WaitForFixedUpdate 모든 FixedUpdate가 모든 스크립트에 호출된 후 계속됩니다.
- yield WWW WWW 다운로드가 완료된 후 계속됩니다.
- yield StartCoroutine 코루틴을 연결하고 MyFunc 코루틴이 먼저 완료되기를 기다립니다.
오브젝트를 파괴할 때
- OnDestroy: 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 이 함수가 호출됩니다. 오브젝트는 Object.Destroy 또는 씬 종료에 대한 응답으로 파괴될 수 있습니다.
종료 시
다음 함수는 씬의 활성화된 모든 오브젝트에서 호출됩니다.
- OnApplicationQuit: 이 함수는 애플리케이션 종료 전 모든 게임 오브젝트에서 호출됩니다. 에디터에서 사용자가 플레이 모드를 중지할 때 호출됩니다.
- OnDisable: 동작이 비활성화되거나 비활성 상태일 때 이 함수가 호출됩니다.
스크립트 수명 주기 플로우차트
다음 다이어그램은 스크립트의 수명 동안 이벤트 함수의 호출 순서에 대한 요약입니다.
이전까지는 일반 업데이트와 물리 업데이트 이 이후부턴 주로 렌더링 위주의 업데이트
ref : https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html
MonoBehaviour 실행순서
오브젝트 생성 순서와 상관없이 컴포넌트 추가 시점에서 가장 나중에 추가 된것이 가장 먼저 실행됩니다.
'게임엔진(GameEngine) > Unity3D' 카테고리의 다른 글
다중 씬 편집(Multi Scene Editing) (0) | 2018.03.28 |
---|---|
yield return new 조건으로 wait 하기 WaitUntil, WaitWhile (0) | 2018.03.04 |
Invoke와 StartCoroutine 의 차이는 오브젝트 비활성화일때의 실행여부 (0) | 2018.03.04 |
UnityEvent, UnityAction and Delegate (0) | 2018.02.25 |
비동기 scene 로딩처리와 진행바 Loading Screen with Progress Bar with allowSceneActivation (0) | 2018.02.17 |