Frontend/Unity

[유니티 기초] 유니티 생명주기 (Life Cycle)

에반황 2016. 8. 4. 16:22


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.



유니티의 생명주기

유니티는 사용자가 호출하지 않아도 호출되는 함수들이 있습니다. 그 함수의 호출 주기를 유니티의 생명주기(LifeCycle)이라고 부릅니다. 함수들의 호출 시기는 사용자가 정할 수 없으므로 생명주기에 대해 이해하는 것은 유니티를 다루는데 필수입니다. 아래의 그림은 거대한 유니티 생명주기의 산맥 중에서 굵직 굵직한 중요한 함수들의 흐름을 따로 뽑아서 그려본 것 입니다. 유니티를 시작할 때 아래의 함수의 흐름만 알아도 많은 도움이 될 것 입니다.




Reset : 오브젝트를 생성 후 인스펙터 뷰에서 리셋을 눌러줄 때 실행됩니다. 객체의 속성을 초기 값으로 설정해 줄 때 사용합니다.


Awake : 스크립트가 실행될 때 한번만 호출됩니다. 모든 오브젝트가 초기화 된 후 호출되기 때문에 GameObject.Find 같은 명령문을 안전하게 사용할 수 있습니다. Awake 함수는 언제나 Start 함수 전에 호출되므로 초기화 순서를 정할 수 있게 합니다. (Coroutine 사용 불가)


OnEnable : 인스펙터뷰에서 체크를 통해서 게임 오브젝트를 활성화 할 때 사용됩니다. 활성화 할 때마다 호출 됩니다.


Start : Update 함수가 호출되기 전에 한번만 호출됩니다. 다른 스크립트의 모든 Awake가 모두 실행된 이후에 실행됩니다. 스크립트가 활성화 되어 있어야합니다.


FixedUpdate : 주로 물리 엔진을 사용하는 경우 일정 시간 간격으로 힘을 가할 때 사용하는 함수입니다. 발생 주기가 일정합니다. (Default : 0.02초)


Update : 프레임마다 호출되는 함수로 게임의 핵심 로직에 사용됩니다. 스크립트가 활성화 되있어야 사용 가능하고, 주기가 일정하지 않습니다.


LateUpdate : 모든 Update 함수가 실행되고 나서 호출됩니다. 주로 카메라 이동 로직에 사용합니다.


OnDisable : 게임 오브젝트 또는 스크립트가 비 활성화 되었을 때 호출됩니다. (Coroutine 사용 불가)


OnDestroy : 오브젝트 생존기간의 마지막 프레임이 업데이트 된 후 실행됩니다. (Object.Destroy 또는 씬 종료 시)


OnApplicationQuit : 응용프로그램 종료 전에 모든 오브젝트에서 호출됩니다. 에디터에서는 플레이 모드를 중지하면 나타납니다.



생명주기에 대해 더 자세한 정보는 유니티 사이트를 참조하세요.












Awake, Start Difference

Awake 함수는 비활성화 상태에서도 호출된다, Start 함수는 활성화 상태일 때만 호출되므로 두 상관관계를 고려해서 초기화작업을 진행할 수 있다.




위와 같이 실행 순서를 알기 위해 스크립트를 작성해 메인 카메라에 붙여줍니다.













스크립트를 비활성화 시킨 상태에서 게임을 실행시켜봅니다.














위와 같이 Awake 함수만 실행되는 것을 볼 수 있습니다.















이번에는 플레이 모드에서 스크립트를 활성화 해봅니다.













위와 같이 Start 함수가 생성됩니다.













FixedUpdate, Update, LateUpdate Difference


[Update]

업데이트는 주기적으로 호출되지 않으면서 조정이 필요한 대부분의 기능이 여기서 구현됩니다. 1프레임이 완료되는데 걸린 시간은 Time.deltaTime을 통해서 확인 할 수 있습니다.




[FixedUpdate]

규칙적인 시간 간격으로 호출됩니다.  이 함수가 호출된 후에 물리 계산이 수행됩니다. 따라서 리지드바디 같은 물리에 영향을 받는 것들은 업데이트 함수보다는 이 함수에서 호출해야합니다. (업데이트는 불규칙한 함수이기 때문에 충돌 검사가 제대로 안될 수 있습니다.)



[LateUpdate]

모든 업데이트 함수가 호출된 후에 호출됩니다. 일반적으로 카메라 이동 로직에 사용하는데 그 이유는 업데이트 문에서 카메라가 촬영할 오브젝트의 활동이 모두 끝나고 카메라가 이동해야하기 때문입니다. 카메라 추적 파트에서 다시 한번 다뤄집니다.







스크립트를 위와 같이 작성해서 각 함수가 어떻게 호출되고 프레임 간격이 얼마인지 확인하도록 하겠습니다.














먼저 FixedUpdate - Update - LateUpdate 순으로 반복되는 것을 확인할 수 있습니다. 여기서 중요한 것은 FixedUpdate 함수의 프레임 간격은 일정한 반면 Update 함수의 주기는 일정하지 않다는 것 입니다.
















생명주기 테스트

지금까지 유니티의 생명주기에 대해서 알아보았습니다. 이번엔 실제 씬 전환을 통해서 어떻게 생명주기가 호출되는지를 직접 확인해보도록 하겠습니다.





이전 장에서 씬 전환에 대해 배웠는데 그 예제를 활용해 씬의 전환이 일어났을 때 어떤 상황이 벌어질지 위의 코드를 추가해 확인해보겠습니다.














첫 번째 씬에서 플레이 모드가 되면 Awake - OnEnable - Start 함수가 순서대로 호출됩니다.











다른 씬을 호출했을 때 현재 씬은 OnDisable - OnDestroy를 거치고 새로운 씬은 첫 씬의 흐름과 동일한 것을 볼 수 있습니다.


















반응형