이벤트 함수 호출 순서
유니티 게시물을 작성을 하는데 어떤 내용부터 써야할지 고민 되었는데..
이참에 매뉴얼을 처음부터 읽어보면서 하자라는 생각이 들어서 이벤트 함수 호출 순서부터 적기로 했습니다.
게임을 만들다 보면 작은 프로잭트를 만들다 보면 Update에다가 무조건 함수나 변수들을 넣는 경우가 발생될 수 있는데 가끔 한번 씩 보면 괜찮을 것 같습니다
에디터 |
Reset |
개체가 처음 연결되었을 때 스크립트의 프로퍼티로 초기화하는 데 호출됩니다. Reset 명령을 실행했을 때도 마찬가지입니다. |
첫 번째 씬 로드 |
Awake |
항상 Start 함수의 이전 및 프리팹의 인스턴스화 직후에 호출됩니다. (만약 게임 오브젝트가 시작할 때 무효인 경우, 활성화되거나 연결된 하나의 스크립트 함수가 호출될 때까지, Awake는 호출되지 않습니다.) |
OnEnable |
이 함수는 오브젝트를 활성화 한 직후에 호출됩니다. 이것은 MonoBehaviour 인스턴스가 생성될 때, 예를 들어 레벨 로드 또는 스크립트 컴포넌트에 연결된 게임 오브젝트가 인스턴스화 될 때 발생합니다. (오브젝트가 활성화된 경우에만 호출됩니다) |
OnLevelWasLoaded |
이 함수는 새로운 레벨이 로드 될 때 호출 됩니다. |
씬에 추가 된 오브젝트에서 모든 스크립트는 Start, Update 등기 기타 함수가 호출되기 전에 Awake와 OnEnable 함수가 호출되는 것에 주의하십시오. 당연히 오브젝트가 게임 플레이 중에 인스턴스화 되었을 때 강제로 호출할 수 없습니다.
[블로그 주인장]
예를 들어서 Start에 제너릭 컬렉션 초기화나 동적 할당을 해 놓고 Awake에서 사용한다면, 당연히 사용할 수 없어 에러가 발생합니다.
첫 번째 프레임의 업데이트 전 |
Start |
스크립트의 인스턴스가 활성화되면 첫 번째 프레임의 업데이트 전에 Start가 호출됩니다. |
씬에 추가된 오브젝트의 Start 함수는 모든 스크립트 Update 및 기타 함수가 호출되기 전에 호출됩니다. 당연히 오브젝트가 게임 플레이 중에 인스턴스화되었을 때 강제로 호출 할 수 없습니다.
[블로그 주인장]
많은 스크립트를 보면 Start에서 초기화를 진행하는데 이 함수는 활성화 단계에서 호출됩니다. 연결된 오브잭트를 비활성화 했다가 활성화 한다고 해도 1번만 호출 됩니다.
프레임 사이 |
OnApplicationPause |
일반 프레임 업데이트 사이에서 pause가 탐지된 프레임의 끝에서 호출 됩니다. OnApplicationPause가 호출되면 추가 프레임이 발행되어, pause 상태를 나타내는 그래픽 인디케이터가 표시 됩니다. |
[블로그 주인장]
pause가 게임의 중단을 의미하는 줄 알았지만..테스트 해본 결과 유니티 상에서 게임을 시작할때 1번 그리고 유니티 화면을 내렸다가 올렸을 때도 호출되는 것을 보면 게임 흐름에 끊김이 발생 될 때 호출 되는 것 같습니다.
업데이트 순서 |
FixedUpdate |
Update()보다 자주 호출되는 경우가 많습니다. 프레임 속도가 낮은 경우에는 프레임마다 여러 번 호출 할 수 있지만, 프레임 속도가 높을 경우 프레임간에 호출 할 수 없습니다. FixedUpdate() 직후에 모든 물리적 특성 계산 및 업데이트가 발생합니다. FixedUpdate()에서 이동 계산을 적용 할 때 Time.deltaTime 값을 곱할 필요는 없습니다. 이것은 프레임 속도와는 독립적으로 FixedUpdate()가 신뢰할 수있는 타이머에서 호출되기 때문입니다. |
Update |
프레임마다 한 번씩 호출됩니다. 이것은 프레임의 업데이트에 대한 주요 기능입니다. |
LateUpdate |
Update() 후 프레임마다 한 번씩 호출됩니다. Update()에서 수행되는 계산이 완료되면 LateUpdate() 함수가 시작 합니다. LateUpdate()의 일반적인 사용은 다음의 3인칭 카메라입니다. Update()에서 캐릭터를 이동하고 회전시킬 경우 LateUpdate()에서 카메라의 이동과 회전 계산을 수행할 수 있습니다. 이렇게하면 캐릭터가 카메라가 그 위치를 추적하기 전에 완전히 이동합니다. |
게임 로직 인터랙션, 애니메이션, 카메라 위치 등을 추적하는 경우, 각종 이벤트를 사용할 수 있습니다. 일반적인 패턴은 Update() 함수 내에서 대부분의 작업을 수행하는 것입니다만, 다른 함수도 사용할 수 있습니다.
[블로그 주인장]
FixedUpdate은 정해진 Fixed Timestep을 기준으로 일정한 간격으로 호출됩니다. (ms)
Update에서는 프레임 기반으로 체크하기 때문에 프레임에 따라서 충돌 체크가 제대로 되지 않을 수 있습니다. 또 물리효과도 마찬가지 이구요.. 이럴 경우 사용합니다.
Fixed Timestep은 Edit > Project Settings > Time 에서 조절할 수 있습니다.
렌더링 |
OnPreCull |
카메라가 씬을 추려내기 전에 호출됩니다. 컬링(Culling)하여 카메라에 어떤 오브젝트를 표시할 지가 결정됩니다. OnPreCull은 컬링이 발생하기 직전에 호출됩니다. |
OnBecameVisible / OnBecameInvisible |
오브젝트가 카메라에 표시되거나 표시되지 않게 될 때 호출됩니다. |
OnWillRenderObject |
오브젝트가 표시되면 각 카메라에 한 번 호출됩니다. |
OnPreRender |
카메라가 씬의 렌더링을 시작하기 전에 호출됩니다. |
OnRenderObject |
모든 씬 렌더링 종료 후에 호출됩니다. GL 클래스 또는 Graphics.DrawMeshNow을 사용하여 이 시점에 사용자 지정 지오메트리를 그릴 수 있습니다. |
OnPostRender |
카메라가 씬의 렌더링을 종료한 후 호출됩니다. |
OnRenderImage |
화면 렌더링이 완료되고, 화면 이미지 처리가 가능하게 된 후에 호출됩니다. |
OnGUI |
GUI 이벤트에 따라 프레임마다 여러 차례 호출됩니다. 레이아웃 및 리페인트 이벤트가 먼저 처리된 후 레이아웃 및 키보드 / 마우스 이벤트가 각 입력 이벤트에 대해 처리됩니다. |
OnDrawGizmos | 시각화를 위한 씬 뷰에서 기즈모(Gizmos)를 그리는 데 사용됩니다. |
렌더링 함수는 기즈모를 그릴 때 빼고는 거의 사용한 적이 없는 것 같습니다.
이 참에 사용할 부분이 있다면 사용해봐야겠네요..
코루틴 |
yield |
코루틴은 다음 프레임에서 모든 Update 함수가 호출된 후에 속행합니다. |
yield WaitForSeconds |
프레임에 대한 모든 Update 함수가 호출된 후 지정된 시간 지연 후에 속행합니다. |
yield WaitForFixedUpdate |
모든 스크립트에서 모든 FixedUpdate 호출 후 속행합니다. |
yield WWW |
다운로드 완료 후 속행합니다. |
yield StartCoroutine |
코루틴을 연결하고 MyFunc 코루틴이 먼저 완료될 때까지 기다립니다. |
일반적인 코루틴 업데이트는 Update 함수가 반환된 후 수행됩니다. 코루틴은 YieldInstruction이 종료할 때까지 그 실행(생성)을 중지할 수 있는 함수입니다.
[블로그 주인장]
YieldInstruction 란, 모든 yield 명령의 기본 클래스를 말합니다.
https://docs.unity3d.com/kr/current/ScriptReference/YieldInstruction.html
오브젝트를 파기할 때 |
OnDestroy |
오브젝트 생존기간의 마지막 프레임의 프레임 업데이트 후 OnDestroy가 호출됩니다. (오브젝트는 Object.Destroy 또는 씬 종료시에 파기됩니다) |
종료 시 |
OnApplicationQuit |
이 함수는 응용 프로그램 종료 전에 모든 게임 오브젝트에서 호출됩니다. 에디터에서는 사용자가 재생 모드를 중지하면 호출됩니다. 웹 플레이어에서는 웹 뷰가 닫힐 때 호출됩니다 |
OnDisable |
이 함수는 동작이 비활성화 될 때 호출됩니다. |
스크립트 라이프 사이클 플로우차트(Script Lifecycle Flowchart)
[출처]
유니티 매뉴얼
https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html
'엔진 > Unity' 카테고리의 다른 글
[UNITY] Custom Unity Shaders (0) | 2016.11.07 |
---|---|
[UNITY] 오브잭트 풀링 - OBJECT POOLING (0) | 2016.09.29 |
[UNITY] 캐릭터 회전 - Character Rotation (0) | 2016.09.29 |