[Unity]Unity Monobehaviour 생명주기(life cycle)

2022. 4. 12. 23:06Tech/Unity

    목차

이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.

 

서론

 Unity를 다뤄본 사람이라면, 스크립트를 작성할 때 Awake() 함수나 Update() 함수 등을 본 적이 있을 것입니다. 이러한 함수들은 호출하지 않아도 자동으로 호출되는 함수들이며, 이들의 호출되는 순서를 생명주기(Lifecycle)이라고 합니다. Unity 코드 작업을 할 때 많은 부분이 Monobehaviour와 연관이 깊습니다. 엔진 쪽의 코어 기능이나, 심지어 렌더링 쪽도 연관이 깊기에 생명주기를 알지 못한다면 곤란하지 않을까 싶습니다. 오늘은 어찌 보면, Unity 코딩의 기본인 Monobehaviour의 생명주기에 관해 다뤄보려 합니다.


Unity Monobehaviour life cycle

아래는 플로우를 그림으로 표현한 것입니다.

[그림 1. Unity Monobehaviour life cycle]

 

위 그 그림에 나온 것들을 부분 부분 나누어서 하나하나 살펴보겠습니다.

  • Editor 부분
    1. Reset() : Reset명령이 주어졌을 때나 스크립트가 개체에 처음 연결될 때 호출
  • Initialization 부분
    1. Awake() : 프리팹 인스턴스화 직후에 호출. 스크립트가 활성화될 때 가장 처음 호출되는 함수
    2. OnEnalbe() : 이 함수는 오브젝트를 활성화 한 직후에 호출
    3. Start() : 활성화된 후, 첫 프레임에서 한번 가장 먼저 호출
  • Physics
    1. FixedUpdate() : Update() 함수가 매 프레임마다 호출된다면, 이 함수는 설정된 일정 주기에 따라 호출됨. 주로 프레임에 독립적인 물리연산 등의 계산에 쓰임

    2. OnTrigger~ : 충돌체가 트리거일(isTrigger == true) 경우 발생되는 이벤트 함수. 충돌 후 물리효과가 적용될 필요가 없는경우에 사용

    3. OnCollider~ : 충돌체가 콜라이더일(isTrigger == false) 경우 발생되는 이벤트 함수. 충돌후 물리효과가 적용돼야 할 경우 사용

  • InputEvent 부분 마우스, 키보드, 터치 이벤트가 호출되는 부분

  • Logic 부분
    1. Update() : 매 프레임마다 스크립트가 활성화돼있다면 호출. 주로 프레임 단위의 갱신에 사용
    2. LateUpdate() : Update() 함수가 호출된 직후 호출. Update()에서 처리 후 무언가를 처리할 경우 이곳에 처리하면 됨
    3. yield ~ : 비동기로 처리되는 코루틴들은 Update()가 반환된 후 처리 => 단 yield WaitForFixedUpdate()의 경우는 Physics 부분
  • Decommissioning 부분
    1. OnDestroy() : 오브젝트 생존기간의 마지막 부분에 호출. 이 함수의 호출로 생명주기가 끝

굵직한 몇몇 중요 함수들과 부분만 설명해보았습니다. 순서 자체를 요약해보면 아래와 같겠습니다.

에디터 실행 -> 오브젝트 초기화 -> 물리 업데이트 -> 입출력 이벤트 -> 로직 갱신 -> 렌더링 -> 비활성화 -> 파괴

어쩌면 당연한 순서이지 않나요? 에디터가 켜지고 오브젝트가 초기화되고, 오브젝트 내부의 로직들이 갱신된 다음에 그림이 그려집니다. 그리고 비활성화가 먼저 돼서 안전하게 파괴까지... 이처럼 라이프 사이클을 알면, 어떤 부분에서 무슨 처리를 해야 하며 프로그래밍의 순서를 설계하는데 도움이 될 것입니다. 그래서 기본이 아닐까 싶습니다.

 

여담으로 이 함수들이 스크립트상에서 존재한다면, 정의되지 않았더라도 호출됩니다. 조금이라도 성능에 보탬이 되고 싶다면, 비어있는 이벤트 함수들은 스크립트 상에서 삭제하도록 합시다. (호출하지 않아도 호출된다는 것과는 별개의 이야기입니다.)


리소스 출처

[그림 1] : 유니티 공식문서, https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html

반응형
LIST

'Tech > Unity' 카테고리의 다른 글

[Unity]직렬화(Serialization)  (0) 2022.04.13
[Unity]로드된 리소스의 메모리 누수  (0) 2022.04.13
[Unity]Unity mobile native plugin  (0) 2022.04.12
[Unity]Scene 사이의 전환  (0) 2022.04.12
[Unity]코루틴(Coroutine)  (0) 2022.04.12