말감로그

[Unity] 유니티 이벤트 함수의 실행 순서 본문

Unity

[Unity] 유니티 이벤트 함수의 실행 순서

habbn 2024. 7. 12. 03:17
728x90

 

유니티에서 제공하는 이벤트 함수가 생성부터 종료까지 어떤 순서로 실행되는지 플로우 차트로 표현한 것이다.

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

 

Initialization 초기화 

 

Awake

  • 씬이 로드된 이후 모든 이벤트 함수를 통틀어 가장 처음에 호출되는 함수이다.
  • 씬의 모든 게임 오브젝트가 초기화된 후 스크립트 컴포넌트의 인스턴스가 생성(인스턴스화)되면 Awake 함수가 호출된다.
  • 컴포넌트가 비활성화(Disable) 이어도 호출된다. 이후 씬이 종료될 때까지는 다시는 호출되지 않는다.

OnEnable

  • 씬이 로드된 후 게임 오브젝트 + 스크립트 컴포넌트가 활성화(Enable) 될 때마다 호출되는 함수이다.
  • 따라서 씬이 로드될 때 이미 Enable이라면 Awake 직후에 바로 호출되고, 씬이 로드되는 순간에 컴포넌트가 Disable이면 OnEnable은 호출되지 않는다.

Start

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

⁎ Awake, Start 차이

  • Awake: 오브젝트가 생성될 때 가장 먼저 호출된다.(인스턴스화 된 직후, Start - 첫 번째 프레임 업데이트 전),  오브젝트가 비활성화된 상태에서도 호출된다.
  • Start: 모든 Awake 메서드가 완료된 후, 오브젝트가 활성화된 상태에서 호출된다.
  • 스크립트 간의 참조 관계는 Awake에서, 스크립트 간의 정보 공유는 Start에서 해주는 것이 바람직하다.

 

Physics 물리 함수

FixedUpdate

  • 매 함수 호출 간격이 다른 Update와 달리 FixedUpdate는 함수 호출 간격이 일정하도록 보장된다. 따라서 매번 일정한 주기로 똑같은 연산을 처리해야 하는 물리 계산 및 업데이트, 또는 Ray 처리에 주로 사용되는 함수이다. Rigidbody 컴포넌트를 활용하는 코드의 실행은 FixedUpdate에서 이루어지는 것이 더 정확한 물리 계산이 가능하다.
  • 물리 계산에 유리하다는 특성은 FixedUpdate의 호출 간격이 일정하다는 것 덕분인데, 이는 Update가 매 프레임 실행되던 것에 비해 FixedUpdate는 프레임 속도(FPS)에 관계없이 Fixed Timestep이라는 정해진 시간 간격에 따라 호출되기 때문이다.

  • FPS가 낮은 경우 프레임 당 여러 번 호출될 수 있으며 FPS가 높은 경우 프레임 사이에 호출되지 않을 수 있다.

  • 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 실행한다. 그리고 FPS가 독립적으로 호출되기 때문에 이동 관련 코딩을FixedUpdate 함수에서 호출한다면 Time.deltaTime은 곱해줄 필요가 없다.

OnTriggerXXX

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

 

OnCollisionXXX

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

 

yield WaitForFixedUpdate

  • 일반적으로 코루틴은 Update 함수 반환 후에 실행되지만 yield WaitForFixedUpdate 함수는 FixedUpdate 이후 Update 호출 전에 호출된다.
  • 코루틴을 'FixedUpdate' 루프가 완료될 때까지 일시 정지시키는 명령어로, 물리 연산 후에 실행되어야 하는 작업을 처리할 때 유용하다.

Game logic 게임 로직

Update

  • 매 프레임 호출되는 기본적인 Update 함수로, 프레임마다 전체 시스템에서 수행되는 작업의 양이 매번 다르므로 Upate가 호출되는 주기가 일정하지 않다. 실제 Time.deltaTime을 출력하면 매 프레임 사이 시간이 일정하지 않다는 것을 확인할 수 있다.
  • Time.deltaTime직전 프레임이 완료되는데 까지 걸린 시간 즉, 현재 프레임과 이번 프레임 사이 시간을 초 단위로 나타낸다. 이 값을 사용하면 프레임 레이트에 관계없이 일정한 속도로 움직임이나 애니메이션을 구현할 수 있다. 

코루틴 yield 함수들

  •    yield null = 다음 Update 함수 후에 호출된다.

  •    yield WaitForSecond = 지정한 시간이 지난 후 호출된다.

  •    yield WWW = 웹 통신 작업이 완료된 후에 호출된다.

  •    yield StartCoroutine = 지정한 코루틴 함수가 끝난 뒤 호출된다.

 

LateUpdate

  •    Update가 끝난 후 프레임당 한 번 호출되는 함수로, Update에서 수행된 계산은 LateUpdate가 시작할 때 완료된다.

  •    기본적으로 3인칭 카메라에 사용되며, 플레이어를 움직이고 LateUpdate에서 카메라 움직임을 계산할 때 주로 사용된다.

 

렌더링 관련 함수

  •    크게 신경 안써도 된다. LateUpdate 후에 렌더링된다.

 

yield WaitForEndOfFrame

  • 모든 업데이트 관련 함수들(FixedUpdate, Update, LateUpdate)이 끝난 뒤 호출된다.
  • 현재 프레임의 렌더링 작업이 모두 완료된 후에 코루틴을 재개시켜야 할 때 사용된다. 이를 통해 프레임의 마지막 시점에 작업을 수행하거나, 렌더링 완료 후의 특정 작업을 처리할 수 있다.

OnApplicationPause

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

 

OnDisable

  •     오브젝트가 비활성화될 때 호출된다.

 

OnApplicationQuit

  •     프로그램이 종료될 때 호출된다.

 

OnDestroy

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

 

 


 

이벤트 함수 실행 순서(Execution Order of Event Functions) - Unity 매뉴얼

Unity 이벤트 함수는 사전에 정해진 순서대로 실행됩니다. 실행 순서는 다음과 같습니다.

docs.unity3d.com

 

 

 

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

아래 사진은 유니티 스크립트 라이프사이클 플로우 차트입니다. 자주 사용하는 이벤트 함수만 서술하도록 하겠습니다. 기본적인 호출 순서대로 적혀있습니다. Awake 프리팹이 인스턴스화 된 직

happysalmon.tistory.com

 

728x90