이 글은 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
스크립트를 위와 같이 작성해서 각 함수가 어떻게 호출되고 프레임 간격이 얼마인지 확인하도록 하겠습니다.
먼저 FixedUpdate - Update - LateUpdate 순으로 반복되는 것을 확인할 수 있습니다. 여기서 중요한 것은 FixedUpdate 함수의 프레임 간격은 일정한 반면 Update 함수의 주기는 일정하지 않다는 것 입니다. |
생명주기 테스트
이전 장에서 씬 전환에 대해 배웠는데 그 예제를 활용해 씬의 전환이 일어났을 때 어떤 상황이 벌어질지 위의 코드를 추가해 확인해보겠습니다.
첫 번째 씬에서 플레이 모드가 되면 Awake - OnEnable - Start 함수가 순서대로 호출됩니다.
다른 씬을 호출했을 때 현재 씬은 OnDisable - OnDestroy를 거치고 새로운 씬은 첫 씬의 흐름과 동일한 것을 볼 수 있습니다.
'Frontend > Unity' 카테고리의 다른 글
[유니티 C# 기초 강의] 13. SendMessage와 BroadcastMessage (0) | 2016.08.05 |
---|---|
[유니티 트랜스폼] 카메라 추적 (Follow Cam) (1) | 2016.08.04 |
[유니티 트랜스폼] 회전 (Rotate) (0) | 2016.08.04 |
[유니티 기초] Time.deltaTime (7) | 2016.08.04 |
[유니티 트랜스폼] 이동 (Move) (5) | 2016.08.04 |
[유니티 실전 예제] 씬 전환 (10) | 2016.08.04 |