[Unity] Script Lifecycle

박민주·2021년 11월 30일
1

Unity

목록 보기
4/40
post-thumbnail

Unity로 많은 프젝을 했었지만
막상 Life cycle을 물어보면 명확히 대답을 할 수가 없었다

기본 중에 기본이고 처음에 분명 배웠는데ㅠ
그래서 다시 한 번 짚고 넘어가고자 한다!

Script Lifecycle Flowchart


에디터

1. Reset

- 개체가 처음 연결되었을 때, 스크립트의 프로퍼티로 초기화하는 데 호출됨
- Reset 명령을 실행했을 때도 마찬가지로 호출됨

첫 번째 씬 로드

이 함수들은 씬이 시작되면 호출됨 (씬의 각 오브젝트에 대해 한 번)

2. Awake

- 항상 Start 함수의 이전 및 프리팹의 인스턴스화 직후에 호출됨
- 만약 게임 오브젝트가 시작할 때 무효인 경우, 활성화되거나 연결된 하나의 스크립트 함수가 호출될 때까지, Awake는 호출되지 않음

3. OnEnable

- 오브젝트가 활성화된 경우에만 호출되며, 오브젝트를 활성화 한 직후에 호출됨
- MonoBehaviour 인스턴스가 생성 될 때, 예를 들어 레벨 로드 또는 스크립트 컴포넌트에 연결된 게임 오브젝트가 인스턴스화 될 때 발생함

4. OnLevelWasLoaded

- 새로운 레벨의 로드가 완료되었다는 것을 알리기 위해 실행됨

Note

-> 씬에 추가된 오브젝트에서 모든 스크립트는 Start, Update 등 기타 함수가 호출되기 전에 Awake와 OnEnable 함수가 호출됨
-> 오브젝트가 게임 플레이 중에 인스턴스화 되었을 때 강제로 호출할 수 없음

첫 번째 프레임의 업데이트 전

5. Start

- 스크립트의 인스턴스가 활성화되면 첫 번째 프레임의 업데이트 전에 Start가 호출됨

Note

-> 씬에 추가된 오브젝트의 Start 함수는 모든 스크립트의 Update 및 기타 함수가 호출되기 전에 호출됨

프레임 사이

6. OnApplicationPause

- 일반 프레임 업데이트 사이에서 pause가 탐지된 프레임의 끝에서 호출됨
- OnApplicationPause가 호출되면 추가 프레임이 발행되어, pause상태를 나타내는 그래픽 인디케이터가 표시됨

업데이트 순서

게임 로직 인터랙션, 애니메이션, 카메라 위치 등을 추적하는 경우, 각종 이벤트를 사용할 수 있음
일반적으로는 Update() 내에서 대부분을 수행하지만, 다른 함수도 사용 가능

7. FixedUpdate

- Update()보다 자주 호출되는 경우가 많음
프레임 속도가 낮은 경우에는 프레임마다 여러 번 호출할 수도 있지만, 프레임 속도가 높을 경우 프레임 간에 호출할 수 없음.
- FixedUpdate() 직후에 모든 물리적 특성 계산 및 업데이트가 발생함
- FixedUpdate()에서 이동 계산을 적용할 때 Time.deltaTime을 곱할 필요 없음
- FixedUpdate()는 프레임 속도와는 독립적으로 별도 타이머에서 호출되기 때문

8. Update

- 프레임마다 한 번씩 호출됨
- 프레임의 업데이트에 대한 주요 기능
- 프레임의 속도에 따라 호출 간격이 불규칙할 수 있음

9. LateUpdate

- Update() 후 프레임마다 한 번씩 호출됨
- Update()에서 수행되는 계산이 완료되면 LateUpdate()함수가 시작됨
- LateUpdate()의 일반적인 사용은 3인칭 카메라
- Update()에서 캐릭터를 이동하고 회전시킬 경우, LateUpdate()에서 카메라의 이동과 회전 계산을 수행할 수 있음
- 이렇게 하면 캐릭터가 카메라가 그 위치를 추적하기 전에 완전히 이동함

렌더링

10. OnPreCull

- 카메라가 씬을 추려내기 전에 호출됨
- 컬링(Culling)하여 카메라에 어떤 오브젝트를 표시할 지 결정되며, OnPreCull은 컬링이 발생하기 직전에 표시됨

11. OnBecameVisible / OnBecameInvisible

- 오브젝트가 카메라에 표시되거나 표시되지 않게 될 때 호출됨

12. OnWillRenderObject

- 오브젝트가 표시되면 각 카메라에 한 번 호출됨

13. OnPreRender

- 카메라가 씬의 렌더링을 시작하기 전에 호출됨

14. OnRenderObject

- 모든 씬 렌더링 종료 후에 호출됨
- GL 클래스 또는 Graphics.DrawMeshNow를 사용하여 이 시점에 사용자 지정 지오메트리를 그릴 수 있음

15. OnPostRender

- 카메라가 씬의 렌더링을 종료한 후 호출됨

16. OnRenderImage

- 화면 렌더링이 완료되고, 화면 이미지 처리가 가능하게 된 후에 호출됨

17. OnGUI

- GUI 이벤트에 따라 프레임마다 여러 차례 호출됨
- 레이아웃 및 리페인트 이벤트가 먼저 처리된 후 레이아웃 및 키보드 / 마우스 이벤트가 각 입력 이벤트에 대해 처리됨

18. OnDrawGizmos

- 시각화를 위한 씬 뷰에서 기즈모를 그리는 데 사용됨

코루틴

일반적인 코루틴 업데이트는 Update함수가 반환된 후 수행됨
코루틴은 YieldInstruction이 종료할 때까지 그 실행(생성)을 중지할 수 있는 함수
- yield : 코루틴은 다음 프레임에서 모든 Update 함수가 호출된 후에 수행됨
- yield WaitForSeconds : 프레임에 대한 모든 Update 함수가 호출된 후 지정된 시간 지연 후에 수행됨
- yield WaitForFixedUpdate : 모든 스크립트에서 모든 FixedUpdate 호출 후 수행됨
- yield WWW : WWW 다운로드 완료 후 수행됨
- yield StartCoroutine : 코루틴을 연결하고 MyFunc 코루틴이 먼저 완료될 때까지 기다림

오브젝트를 파기할 때

19. OnDestroy

- 오브젝트 생존기간의 마지막 프레임의 프레임 업데이트 후 OnDestroy가 호출됨
- 오브젝트는 Object.Destroy 또는 씬 종료시에 파기됨

종료 시

씬 안에 있는 모든 활성 오브젝트에서 호출됨

20. OnApplicationQuit

- 응용 프로그램 종료 전에 모든 게임 오브젝트에서 호출됨
- 에디터에서는 사용자가 재생 모드를 중지하면 호출됨
- 웹 플레이어에서는 웹 뷰가 닫힐 때 호출됨

21. OnDisable

- 이 함수는 동작이 비활성화 될 때 호출됨

유니티 메뉴얼 페이지를 참고해서 작성했다
거의 복붙느낌이지만 잘 사용해보지 못한 렌더링 함수에 대해서도 알 수 있었다
다음에는 각 함수를 사용해보면서 더 자세히 알아봐야겠다

참고

https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html

profile
Game Programmer

0개의 댓글