유니티에서는 지정된 순서에 맞춰서 여러 개의 이벤트 함수들이 실행된다. 해당 이벤트 함수들을 상황에 알맞게 사용하여 실행 흐름에 맞는 프로그래밍을 진행할 수 있다. 간혹가다가 순서가 꼬일 경우, 시스템의 기능이 정상적으로 작동하지 않을 수 있기 때문에 유의해야 한다.

첫 번째 씬 로드
Scene이 시작하고 호출이 진행된다. 이벤트 함수 중에 가장 초기에 있기 때문에 초기화나 값 설정을 필요로 할 때, 많이 사용된다.
1. Awake
- Start 함수 전에 실행이 되며, 프리팹 인스턴스 화 이후 호출된다.
- 오브젝트가 비활성화인 상태에서는 실행되지 않는다.
2. OnEnable
- 오브젝트가 비활성화인 상태에서 실행되지 않는다.
- 오브젝트 활성화 시 실행되며, 무언가 수정이 이루어졌을 때 실행된다.
에디터
1. Reset
- 오브젝트에 처음 연결하거나, Reset 커맨드를 사용할 때 호출된다.

Reset 함수는 사용 빈도가 낮아서 어디에서 호출되는지 확인했다. 스크립트의 메뉴버튼에서 Reset을 눌렀을 경우 실행된다. 스크립트에 고정적으로 들어가야 하는 값이 있다면 해당 함수를 통해서 저장하는 것이 좋을 것 같다.
2. OnValidate
- 스크립트의 프로퍼티가 설정될 때 호출되며, 에디터에서 씬을 열 때와 도메인을 다시 로드한 이후 다양한 시기에 호출이 가능하다.

OnValidate 함수는 완전히 사용 빈도가 없었어서 어디에서 호출되는지 확인했다. Script를 수정하고 유니티로 돌아오면 Reload하는 과정에서 함수가 실행됨을 확인할 수 있었다.
해당 함수는 확실하게 변수가 가지면 안되는 값이 들어가있을 경우, 혹은 무언가 강제된 내용을 수정할 때 사용하면 좋을 것 같다.
첫 프레임 업데이트 전
1. Start
- 스크립트 인스턴스가 활성화 이후, 첫 프레임 업데이트 이전에 실행된다. 한 마디로 Update 메서드가 처음으로 실행되기 전 한 번 실행된다.
프레임 사이
1. OnApplicationPause
- 일시정지가 감지된 프레임의 끝에서 실행이 되며 그래픽스 표시를 위해서 한 프레임을 추가로 실행한다.
- 게임 도중에 유저가 잠시 핸드폰 홈 바탕으로 나갔거나, PC의 배경화면으로 벗어났을 경우, 유니티에서는 해당 상태를 OnApplicationPause 상태로 판단한다. 인자값으로 bool형 변수를 받아서 true/false를 통해 유저가 화면에 나갔는지를 확인할 수 있다.
업데이트 순서
1. FixeUpdate
- 프레임 속도에 따라서 Update 함수보다 자주 호출될 수 있다.
- 낮은 프레임에선 여러 번 호출되며, 높은 프레임에서는 호출되지 않을 수 있다.
- 모든 물리 계산 및 업데이트는 FixeUpdate 후 발생한다. 이 함수에서는 Time.deltaTime을 통해서 프레임 간 보정을 할 필요 없어진다.
2. Update
- 프레임 당 한 번 호출된다.
3. LateUpdate
- Late에 맞게 Update가 끝나고 늦게 실행된다. Update에서 계산이 끝난 이후, LateUpdate가 실행되므로 확실히 계산이 나뉘어야 한다면 해당 함수에서 실행하는 것이 올바르다.
애니메이션 업데이트 루프
1. OnStateMachineEnter, Exit
2. Fire Animation
- 애니메이션 업데이트 루프는 설명하기 보다는 실행 순서가 이 위치라는 것을 알기 위해서 작성되었다.
- 애니메이션 시스템에서 사용되는 루프로 상세히 알기 위해서는 맨 하단의 유니티 공식 사이트를 참고하는 것을 권장한다.
렌더링
1. OnPreCull
- 카메라가 씬을 컬링하기 전에 호출된다.
* 컬링이란, 카메라에 보이지 않는 것을 선별하는 과정이다.
* 왜 컬링을 사용하는가? 가상 공간에 있는 모든 오브젝트를 카메라에 그리게 된다면 비용이 무척 비싸기에 일정 범위 안에 있는 오브젝트만 그릴 수 있게 한다.
2. OnBecameVisible / OnBecameInvisible
- 오브젝트가 카메라에 표시되거나, 표시되지 않을 때 호출된다.

해당 기능도 잘 사용하지 않아서 몰랐는데 카메라에 보일 때, 보이지 않을 때 호출되는 함수가 정말 좋은 것 같다. 플레이어의 화면에 보이지 않을 때 오브젝트를 정리하거나, 일정 위치에 도착했을 때 다음 씬을 불러오거나, 등 다양한 시점에서 사용할 수 있을 것 같다.
3. OnWillRenderObject
- 오브젝트가 표시되면 각 카메라에 한 번 호출된다.
* 유니티에서 카메라는 복수로도 사용이 가능한데, 이 때에 복수의 카메라에서 1번씩 호출하기로 약속한 것이다.
4. OnPreRender
- 카메라가 씬 렌더링을 시작하기 전에 호출된다.
5. OnRenderObject
- 일반 씬 렌더링이 처리된 이후 호출된다.
* 개인적인 생각으로는 Post-Processing이 들어가기 전, 모든 오브젝트를 그렸을 때 실행이 되는 것 같다.
6. OnPostRender
- 카메라가 씬 렌더링을 끝내고 호출된다.
7. OnRenderImage
- 씬 렌더링 완료 후, 호출되며 이미지 포스트 프로세싱이 가능한 메서드다.
8. OnGUI
- GUI 이벤트에 따라서 프레임당 여러번 호출될 수 있다.
9. OnDrawGizmos
- Scene View에 Gizmos를 그릴 때 사용된다.
코루틴
1. yield
- 모든 Update 함수가 다음 프레임에 호출 된 후 계속된다.
2. yield WaitForSeconds
- 지정 시간이 종료된 후, 모든 Update 함수가 프레임에 호출된 후 계속된다.
* WaitForSeconds를 통해서 일정 시간까지 지연할 수 있음.
3. yield WaitForFixedUpdate
- 모든 FixedUpdate가 호출 된 이후 계속된다.
4. yield WWW
- WWW 다운로드가 완료되면 계속된다.
* WWW를 통해서 Web 소통이 가능함.
5. yield StartCoroutine
- 코루틴을 연결하고 일정 코루틴이 먼저 완료되기를 기다린다.
오브젝트 파괴
1. OnDestroy
- 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마치고 호출된다.
- 씬 종료를 통해서도 호출할 수 있으며, 오브젝트 파괴에서 이루어진다.
* 하지만 해당 함수는 비용이 비싼 편이고 Destroy 과정에서 Un-Lock 과정이 복잡할 수 있다.
종료
1. OnApplicationQuit
- 어플리케이션 종료 시, 호출된다.
2. OnDissable
- 동작 비활성화 상태, 오브젝트 비활성화 상태에서 해당 함수가 실행된다.
참고 사이트
https://docs.unity3d.com/kr/2021.3/Manual/ExecutionOrder.html
'엔진, 프레임워크 > Unity' 카테고리의 다른 글
UI에서 Particle System 추가하는 방법 - Raw Image & Render Texture (1) | 2023.11.12 |
---|---|
Unity - Bezier Curve에 대해서 학습해보자. (0) | 2023.08.31 |
Unity - AnimationCurve를 사용해보자. (0) | 2023.08.28 |
[UI Toolkit] 2. UI Builder가 아닌 UXML로 만들기 (0) | 2023.05.18 |
[UI Toolkit] 1. UI Builder를 사용한 UI 배치 (0) | 2023.05.17 |