Game Development, 게임개발/개발

Script lifecycle, 이벤트 함수의 실행 순서 [Unity]

게임이 더 좋아 2021. 3. 27. 04:59
반응형
728x170

 

Start(), Update()만 봐도 잘 돌아간다고 할 수 있지만

크고 복잡한 게임일수록 다른 이벤트함수들이 많이 필요하다.

그래서 다시 한 번 정리하는 느낌으로 하나씩 살펴보자.

 

**2020.3(LTS)버전이다. 이전 버전은 조금 다르게 생기긴 했다. 큰 틀은 안 바뀌었겠지만.

 


 

이게 바로 그 큰 그림이다.

 

Internal function보다 Uswer callback을 보면 더 좋다.

물론 우리가 사용할 수 있는 함수가 User callback이지만 큰 줄기를 이해하고 그 다음에 더 알아보는 것이 좋다.

 

 

 


 

 

순서대로 하나씩 살펴보자

첫 번째 씬 로드되면 아래 2가지 함수가 실행된다.

씬이 시작할 때(씬에서 오브젝트마다 한 번) 호출된다고 한다.

 

  • Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.

-> 다시 말하면 프리팹이 이미 인스턴스화 되었으니 컴포넌트를 호출할 수 있다는 말이겠다?

-> 비활성(Acitve == false)이면 호출되지 않는다고 보면 되겠다.

-> 딱 1번 실행된다는 말이다. 이미 Start 함수가 호출되었다면 오브젝트의 활성 상태가 꺼졌다 켜져도 Awake는 실행되지 않는다.

-> 많은 사람들이 여기서 값을 초기화한다.

 

 

  • OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다.

-> 역시나 Active == true 일 때만 이 함수를 호출한다.

-> Awake 와는 다르게 활성상태가 비활성에서 활성으로 바뀔 때마다 실행된다.

-> 자주 쓰이는만큼 고려를 많이해서 짜야 할 부분이다.

-> 오브젝트 풀링, Object Pooling 시에 고려해야 할 부분인 것 같다.

 


 

그 다음으로는

 

 

  • Reset은 개체가 처음 연결되었을 때 스크립트의 프로퍼티로 초기화하는 데 호출된다.

->따로 Reset 명령을 호출했을 때도 마찬가지다.

-> 개체가 처음 연결되었다는게 무엇일까? 오브젝트에 스크립트가 컴포넌트로 입력되었을 때인가?

 

 


 

 

첫 번째 프레임이 실행되기 전에는

 

 

 

  • Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출된다.

-> 컴포넌트로 활성화 되어있다면 실행된다는 뜻이다.

-> 여기서도 마찬가지로 값을 초기화하는 작업이 진행될 수 있다.


 

그 다음에는 물리적인 계산부터 실행된다.

 

 

 

  • FixedUpdate: FixedUpdate 는 종종 Update 보다 더 자주 호출된다. 

모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다. 

-> 프레임 속도가 낮은 경우 프레임당 여러 번 호출될 수 있다.

-> 반대로프레임 속도가 높은 경우 프레임 사이에 호출되지 않을 수 있다는 얘기다.

** FixedUpdate 의 움직임 계산을 적용할 때 Time.deltaTime 만큼 값을 곱할 필요가 없다.

-> FixedUpdate 가 프레임 속도와 관계없이 신뢰할 수있는 타이머에서 호출되기 때문이다.

 

 

보면 OnTrigger가 OnCollision보다 먼저 실행된다.

실행순서만 봐도 왜 Trigger로 실행했을 때 물리적인 힘을 받지 않는지 이해가 된다.

 

 


 

입력을 받아들이고 그 다음에 Game Logic을 계산한다.

 

 

  • Update: Update 는 프레임당 한 번 호출된다. 프레임 업데이트를 위한 주요 작업 함수다.

-> 우리가 런타임에서 일어나는 모든 일들은 Update의 덕분이라고 보면 된다.

 

 

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

-> LateUpdate 는 일반적으로 다음의 3인칭 카메라에 사용한다.

-> 즉, 캐릭터를 움직이고 Update 로 방향을 바꾸게 하는 경우 LateUpdate 에서 모든 카메라 움직임과 로테이션 계산을 수행할 수 있다.

-> 이렇게 하면 카메라가 포지션을 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있다.

-> 카메라에 정말 많이 쓴다.

 


 

나머지는 이러한 순서대로 일어난다.

 

 

  • OnDestroy: 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 이 함수가 호출된다.

오브젝트는 씬 종료나 Destroy에 의해서 파괴된다고 말한다.

-> 이것 또한 많은 응용이 될 것 같다.

 

 

아래 함수들은 종료 시 모든 씬의 활성화된 오브젝트에서 실행된다.

  • OnApplicationQuit: 이 함수는 애플리케이션 종료 전 모든 게임 오브젝트에서 호출된다. 에디터에서 사용자가 플레이 모드를 중지할 때 호출된다.
  • OnDisable: 동작이 비활성화되거나 비활성 상태일 때 이 함수가 호출된다.

-> OnEnable과 관련이 깊은 관계다.

-> 즉, 이 함수 역시 Object Pooling과 관계가 있다.

 

마지막으로 

 

프레임 사이

  • OnApplicationPause: 이 함수는 일시 정지가 감지된 프레임의 끝, 실질적으로는 일반 프레임 업데이트 사이에 호출된다. 게임에 일시정지 상태를 가리키는 그래픽스를 표시하도록 OnApplicationPause 가 호출된 후에 한 프레임이 추가로 실행된다.

-> 일시 정지가 되었을 때 실행되는 함수이다.

-> 어플리케이션이 백그라운드로 갔을 때, 아마 호출되지 않을까 싶다.

 

 

 


 

 

이 외에도 애니메이션, 렌더링, 코루틴이 있지만 그것은 여기서 다루기 보다는 따로 다루는 것이 낫다.

 

 


참고링크

 

docs.unity3d.com/

728x90
반응형
그리드형