본문 바로가기
C#

[C#][Unity] 유니티 생명주기

by teamnova 2021. 7. 11.
728x90

안녕하세요! ^~^/

 

오늘은 게임 개발엔진 2top중 하나인 Unity의 생명주기에 대해서 포스팅 해보겠습니다! 

 

유니티는 안드로이드와 마찬가지로 '생명주기(LifeCycle)'를 가지고 있는데요.유니티에서 자신이 제작한 스크립트의 대부분은 'Monobehaviour'라는 친구를 상속받아 만들어집니다. 스크립트를 만들면 자동으로 상속받아지는 형태이니 유니티의 기본 클래스 형태라고 봐도 좋습니다.이 'Monobehaviour'가 Scene에서 살아가는 동안 일정한 흐름이 생기고, 엔진에서 자동으로 호출해주는 함수들이 생기는데 이 패턴의 흐름을  '생명 주기(Life cycle)'라고 합니다.

 

생명주기는 사용자가 호출하지 않아도 프로그램의 흐름에 따라 자동으로 호출되게 됩니다. 그럼 유니티 생명주기의 흐름부터 알아보도록 하겠습니다.

생명주기는 유니티의 공식 홈페이지를 참고하였습니다.

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

유니티의 생명주기는 이런식으로 구성되어있는데요.

내용이 너무 많고 복잡하죠?? 그래서 이번은 중요하다고 생각되고 자주 사용하게되는 생명주기들만 뽑아서~!! 설명하는 시간을 가져볼까 합니다!

 

 

위에있는 생명주기들이 제가 생각 하는 중요하면서도 자주 이용하게 되는 생명주기들인데요! 시작부분과 끝나는 부분은 보기쉽게 묶어 두었으니 참고하세요! 위에서부터 하나하나 살펴보면서 내려가 보겠습니다!

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

  • OnEnable: 게임오브젝트가 활성화 된 직후 호출됩니다! 즉 게임오브젝트가 비활성화 상태에서 활성화 상태가 될 때 마다 호출되는 함수입니다!
  • Reset: 오브젝트에 처음 연결하거나 Reset 커맨드를 사용할 때 스크립트의 프로퍼티를 초기화하기 위해 Reset을 호출합니다.
  • Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 Update 전에 호출됩니다. 다른 모든 스크립트의 Awake가 모두 실행 된 이후에 실행 됩니다!

여기까지가 시작부분에 사용되는 생명주기라고 할 수있습니다! 시작부분이라고 단순하게 생각 했는데 이부분만 봐도 상당한 고민이 필요하다는걸 볼 수 있죠? 다음도 함수도 살펴보겠습니다!

임 로직, 상호작용, 애니메이션, 카메라 포지션의 트랙을 유지할 때, 사용 가능한 몇몇 다른 이벤트가 존재합니다. 일반적인 패턴은 Update 함수에 대부분의 작업을 수행하는 것이지만, 사용할 수 있는 다른 함수도 있습니다.

FixedUpdate: FixedUpdate 는 가끔 Update 보다 유용하게 사용됩니다. Update는 프레임 속도가 높은 경우 프레임당 여러 번 호출될 수 있으며 프레임 속도가 낮은 경우 프레임 사이에 호출되지 않을 수 있습니다.  그러나 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다. FixedUpdate 의 움직임 계산을 적용할 때 Time.deltaTime 만큼 값을 곱할 필요가 없습니다. FixedUpdate 가 프레임 속도와 관계없이 신뢰할 수있는 타이머에서 호출되기 때문입니다. 그러므로 일정한 주기의 Update가 필요한 작업에선 Update보다 FixedUpdate 더 유용합니다! 

  •  OnTriggerXXX: 게임내 Trigger 이벤트 발생시 호출됩니다! (OnTriggerEnter , OnTriggerStay , OnTriggerExit 함수들을 통해 이벤트를 감지 할 수 있습니다!)

  •  OnCollisionXXX: 게임내 Collision 이벤트 발생시 호출됩니다! (OnCollisionEnter, OnCollisionStay, OnCollisionExit 를 통해 이벤트를 감지 할 수 있습니다!)

  • Update: Update는 프레임당 한 번 호출됩니다. 프레임 업데이트를 위한 주요 작업 함수입니다. 호출시기가 프레임이 영향을 받기때문에 컴퓨터 성능에 의해 결과가 바뀔 수 있습니다!.

  • LastUpdate: Update 가 끝난 후 프레임당 한 번 호출됩니다. Update에서 수행된 모든 계산은LateUpdate가 시작할 때 완료됩니다.LateUpdate는 일반적으로 다음의 3인칭 카메라에 사용합니다. 캐릭터를 움직이고Update로 방향을 바꾸게 하는 경우LateUpdate에서 모든 카메라 움직임과 로테이션 계산을 수행할 수 있습니다. 이렇게 하면 카메라가 포지션을 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있습니다.

이부분이 게임을 다채롭게 움직이게 하는 핵심 부분이라고 생각하시면 됩니다! 게임안의 모든 움직임은 이 생명주기에서 다루게 되니 잘 이해하고 넘어가야 하는 부분 입니다!이제 마지막 오브젝트가 사라지는 과정을 보겠습니다!

 

  • OnApplicationQuit: 이 함수는 애플리케이션 종료 전 모든 게임 오브젝트에서 호출됩니다. 에디터에서 사용자가 플레이 모드를 중지할 때 호출됩니다.

  • OnDisable: 게임속 오브젝트 또는 스크립트가 비활성화 될 때 호출됩니다. (Coroutine은 사용 할 수 없습니다)

  • OnDestroy: 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 이 함수가 호출됩니다. 오브젝트는 Object.Destroy 또는 씬 종료에 대한 응답으로 파괴될 수 있습니다.

 

여기까지가 유니티에서 많이 사용하게 되는 생명주기에 대해서 알아보았습니다! 코드는 한줄 한줄 순서대로 호출되기때문에 코드의 순서도 매우 중요하지만 생명주기상에서의 순서를 고려하지 않는다면 코드를 아무리 잘 짜놔도 사용 할 수 없겠죠?유니티 같이 여러개의 스크립트와 오브젝트들이 유기적으로 연결되는 프로그램에서는 생명주기공부가 아주 중요하기때문에 여기에 적어 놓은 생명주기들은 꼭 숙지하고 넘어가셨으면 좋겠습니다!

여기에서 포스팅을 마치도록 하겠습니다!