행복한 연어의 이야기

(Unity) 유니티 이벤트 함수 실행순서 본문

IT/Unity

(Unity) 유니티 이벤트 함수 실행순서

해피살몬 2020. 1. 13. 20:00

아래 사진은 유니티 스크립트 라이프사이클 플로우 차트입니다.

출처 : https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html#AnimationUpdateLoop

자주 사용하는 이벤트 함수만 서술하도록 하겠습니다.

기본적인 호출 순서대로 적혀있습니다.

Awake

  • 프리팹이 인스턴스화 된 직후에 호출됩니다. 오브젝트가 비활성화되어 있다면 awake 함수는 호출되지 않다가 오브젝트가 활성되는 순간 호출됩니다. 그 후 오브젝트를 비활성화(Deactive) -> 활성화(Active) 해도 다시 호출되지 않습니다. 최초 1회만 호출됩니다.
  • Awake 만 있는 스크립트에 경우 스크립트 활성화(Enable) 버튼이 뜨지 않습니다. OnEnable, Start 같은 함수가 있어 스크립트가 비활성화(Disable) 해 놓았더라도 Awake 함수는 호출됩니다.

OnEnable

  • 오브젝트 활성화(Active)(스크립트 활성화(Enable) 포함) 직후 이 함수를 호출합니다. 게임 오브젝트 + 스크립트 모두 활성화되어있어야 합니다.
  • Awake 와는 다르게 비활성화(Deactive) -> 활성화(Active) 할 때마다 호출됩니다. 오브젝트 비활성화(Deactive) -> 오브젝트 활성화(Active) or 스크립트 비활성화(disable) -> 스크립트 활성화(enable) 두 가지 경우 모두 호출됩니다.

Start

  • 스크립트 인스턴스가 활성화된 경우에 호출합니다. 즉 게임 오브젝트 + 스크립트 모두 활성화되어있을 때 최초 1회의 한정하여 호출합니다. 호출 시기는 첫 번째 프레임 업데이트 전입니다..

Awake, Start 차이

  1. Awake 가 Start 보다 빠르다. (Awake는 프리팹 인스턴스화 된 직후, Start는 첫 프레임 전)
    모든 오브젝트의 Awake를 실행하고 Start가 실행된다는 뜻이므로 순서를 잘 생각해야 한다.
    만약 Object1 에서 Script1 의 Start 함수를 호출하고 Object2 에서도 Sctript2의 Start 함수를 호출한다면
    두 스크립트의 Start 함수의 순서는 유니티가 내부적으로 결정하므로 랜덤이라고 생각하면 된다. (기본적으로 제어되지 않는다.)

  2. Awake는 스크립트가 비활성 되어있더라도 호출된다.
    보통 Awake는 자신이 초기화할 수 있는 작업을 수행하고 Start는 다른 Class 를 참조하는 경우 사용한다.

FixedUpdate

  • 기본적으로 매 프레임마다 호출되는 Update 함수보다 덜 호출되지만 종종 더 많이 호출될 수도 있습니다. FPS가 낮은 경우 한 프레임당 여러 번 호출될 수 있고 FPS가 높은 경우 프레임 사이에 호출되지 않을 수 도 있습니다.
  • 모든 물리 계산은 FixedUpdate 함수 뒤 즉시 실행합니다. 그리고 FPS가 독립적으로 호출되기 때문에 이동 관련 코딩을 FixedUpdate 함수에서 호출한다면 Time.deltaTime 은 곱해줄 필요가 없습니다.

OnTriggerXXX

  • OnTriggerEnter, OnTriggerStay, OnTriggerExit 함수가 여기서(Fixed Update 이후에) 실행됩니다.

OnCollisionXXX

  • OnCollisionEnter, OnCollisionStay, OnCollisionExit 함수가 여기서(Fixed Update 이후에) 실행됩니다.

yield WaitForFixedUpdate

  • 호출되는 순서를 잘 기억하는 게 좋습니다. 일반적으로 코루틴은 Update 함수 반환 후에 실행되지만 yield WaitForFixedUpdate 함수는 FiexdUpdate 이후 Update 호출 전에 호출됩니다.

Update

  • 프레임 당 한번 호출됩니다. 프레임 업데이트를 위한 주요 작업 함수입니다.

나머지 yield 함수들

  • yield null = 다음 Update 함수 후에 호출됩니다.
  • yield WaitForSecond = 지정한 시간이 지난 후 호출됩니다.
  • yield WWW = 웹 통신 작업이 완료된 후에 호출됩니다.
  • yield StartCoroutine = 지정한 코루틴 함수가 끝난 뒤 호출합니다.

LateUpdate

  • Update 가 끝난 후 프레임당 한번 호출합니다. Update 에서 수행된 계산은 LateUpate 가 시작할 때 완료됩니다. 기본적으로 3인칭 카메라에 사용합니다. 플레이어를 움직이고 LateUpdate 에서 카메라 움직임을 계산할 때 주로 사용됩니다.

랜더링 관련 함수

  • 기본적으로 크게 신경 안 쓰셔도 됩니다. LateUpdate 후에 랜더링을 하는구나 정도로 알고 계시면 될 거 같습니다.

yield WaitForEndOfFrame

  • 이것도 호출되는 순서를 기억하는 게 좋습니다. 모든 업데이트 관련 함수들 (FixedUpdate, Update, LateUpdate)이 끝난 뒤 호출됩니다.

OnApllicationPause

  • 모든 프레임 계산이 끝난 뒤에 프로그램이 일시정지됩니다. 재 실행하면 FixedUpdate 부터 실행됩니다.

OnApllicationQuit

  • 프로그램이 종료될 때 실행합니다.

OnDisable

  • 오브젝트가 비활성화될 때 실행합니다. OnEnable 과 마찬가지로 오브젝트 Deactive, 스크립트 Disable 모두 호출됩니다.

OnDestroy

  • 오브젝트가 파괴될 때 실행합니다. Awake 와 마찬가지로 스크립트가 비활성화(Disable) 되어있어도 호출됩니다.

기본적으로 제가 이해하고 조사한 내용을 적었습니다.

혹시라도 잘못되어 있으면 댓글로 알려주시면 감사하겠습니다!

Comments