실행 순서 (Execution Order)

Unity 스크립팅에서 스크립트는 미리 정해진 순서대로 실행된다.

First Scene Load

이러한 함수는 씬이 시작될 때 불려진다 (씬에서 각 물체를 위해서 한 번).

  • Awake: 이 함수는 모든 시작 함수전에 불려지고 prefab이 객체화된 후에 불려진다.
  • OnEnable: (물체가 활성화될 때만 불려진다) : 이 함수는 물체가 활성화된 후에 불려진다.

Before the first frame update

  • Start: 스크립트 인스턴스가 활성화될 때만 첫 번째 프레임 업데이트 전에 Start가 불려진다.

Update Order

사용자가 게임 로직과 상호 작용, 애니메이션, 카메라 위치 등을 계속 트랙할 때 사용자가 사용할 수 있는 몇 가지 다른 이벤트가 있다. 공통적인 패턴은 Update()함수에서 대부분의 태스크를 실행한다는 것임. 그러나 사용자가 사용할 수 있는 다른 함수들도 있다.

  • Update: Update()는 프레임마다 한 번 불려진다. 그것은 프레임 업데이트를 위한 주요 함수 임. 스크립트가 enabled 상태일때, 매 프레임마다 호출됩니다. 일반적으로 가장 빈번하게 사용되는 함수이며, 물리 효과가 적용되지 않은 오브젝트의 움직임이나 단순한 타이머, 키 입력을 받을 때 사용됩니다.
  • FixedUpdate: FixedUpdate()Update()보다 더 자주 불려진다. 프레임 레이트가 낮으면 프레임마다 여러번 불려질 수 있고 프레임 레이트가 높다면 프레임 사이에서 한 번도 불려지지 않을 지도 모릅니다. 모든 물리적인 계산과 업데이트는 FixedUpdate() 이후에 직접적으로 일어난다. FixedUpdate() 내부로 움직임 계산이 적용될 때, 사용자는 Time.deltaTime에 의하여 사용자의 값을 곱할 필요가 없다. 이것은FixedUpdate()가 신뢰있는 타이머에서 불려지고 프레임 레이트에 독립적이기 때문임. (Update는 불규칙한 호출임으로 물리엔진 충돌검사 등이 제대로 안될 수 있음)
  • LateUpdate: LateUpdate()Update()가 끝난 후에 프레임마다 마지막으로 한 번 불려진다. Update()에서 수행되는 모든 계산은 LateUpdate()이 시작할 때 끝날 것임. LateUpdate()를 위한 공통적인 사용은 다음의 3인칭 카메라일 것임. 사용자가 사용자의 캐릭터를 움직이고 Update() 내부에서 돌게 한다면 사용자는 모든 카메라 움직임과 회전 계산을LateUpdate()에서 수행할 수 있다. 주로 오브젝트를 따라가게 설정한 카메라는 LateUpdate 를 사용합니다(카메라가 따라가는 오브젝트가 Update함수 안에서 움직일 경우가 있기 때문)

Rendering

  • OnPreCull: 카메라가 씬을 추려내기 전에 불려진다. Culling은 어떤 물체가 카메라에 보일지를 결정함. Culling일 일어나기 전에OnPreCull이 불려진다.
  • OnBecameVisible/OnBecameInvisible: 물체가 카메라에 보이거나/보이지 않게 될 때 불려진다.
  • OnWillRenderObject: 물체가 보이면 각 카메라를 위해서 한 번 불려진다.
  • OnPreRender: 카메라가 씬을 렌더링하는 것을 시작하기 전에 불려진다.
  • OnRenderObject: 모든 보통 씬 렌더링이 끝난 후에 불려진다. 사용자는 이 시점에 사용자 정의 기하를 그리기 위해 GL 클래스 또는 Graphics.DrawMeshNow를 사용할 수 있다.
  • OnPostRender: 카메라가 씬을 렌더링하는 것을 끝낸 후에 불려진다.
  • OnRenderImage(Pro only): 스크린 이미지의 포스트 프로세싱을 허용하기 위해서 씬 렌더링이 완전해진 후에 불려진다.
  • OnGUI: GUI 이벤트에 대한 응답으로서 프레임당 여러번 불려진다. 각 입력 이벤트를 위한 레이아웃과 키보드/마우스 이벤트에 의해 따라오는 레이아웃과 다시 그리기 이벤트는 처음에 프로세스 된다.
  • OnDrawGizmos 시각화 목적으로 씬 뷰에서 기즈모를 그리기 위해 사용된다..

Coroutine

보통의 CoRoutine 업데이트는 업데이트 함수가 리턴한 후에 실행된다. Coroutine은 주어진YieldInstruction가 끝낼 때까지 그것의 실행을 중지할 수 있는 함수임. Coroutines의 다른 사용은 다음과 같다:

  • yield; Coroutine는 다음 프레임에서 부려지는 모든 업데이트 함수가 불려진 후에 계속될 것임.
  • yield WaitForSeconds(2); 프레임을 위해 모든 업데이트 함수가 불려진 후에 지정된 시간 지연 후에 계속된다
  • yield WaitForFixedUpdate();모든FixedUpdate가 모든 스크립트에서 불려진 후에 계속된다
  • yield WWW WWW 다운로드가 완료된 후에 계속된다.
  • yield StartCoroutine(MyFunc); Coroutine을 연결하고 첫 번째로MyFunc coroutine를 완료하기를 기다릴 것임.

When Quitting

이러한 함수들은 사용자의 씬에서 모든 활동적인 물체위에서 불려진다, :

  • OnApplicationQuit: 이 함수는 어플리케이션이 죵료하기 전에 모든 게임 물체위에서 불려진다. 편집기에서 사용자가 플레이 모드를 멈출 때 불려진다. 웹 플레이어에서 웹 뷰가 닫힐 때 불려진다.
  • OnDisable: 이 함수는 행동이 비활성화될 때 불려진다.

정리하면

아래의 순서로 실행되가 된다.

  • 모든 Awake calls
  • 모든 Start Calls
  • while (변수 델타 타임을 위한 단계)
    • 모든 FixedUpdate 함수들
    • Physics simulation
    • OnEnter/Exit/Stay trigger 함수들
    • OnEnter/Exit/Stay collision 함수들
  • Rigidbody 보간은transform.position 과 회전을 적용함
  • OnMouseDown/OnMouseUp 등의 이벤트
  • 모든 Update 함수들
  • 애니메이션은 발전하고 블렌드되고transform 에 적용된다
  • 모든 LateUpdate 함수들
  • Rendering

Hints

  • 사용자가 LateUpdate에서 coroutine을 시작한다면 그것은 렌더링 바로 전에 LateUpdate 후에 불려질 것임.
  • Coroutines은 모든 업데이트 함수 이후에 실행된다.

역링크