본문 바로가기
Unity

[Unity] Monobehaviour Life Cycle 파헤치기

by 소리쿤 2021. 12. 1.

유니티에서 하나의 스크립트는 그 자체로 하나의 클래스(Class)를 뜻하며,
그 중 Behaviour는 활성화(Enable), 비활성화(Disable) 할 수 있는 Component를 의미합니다.

유니티에서 흔히 볼 수 있는 MonoBehaviour는 Unity의 모든 스크립트가 생성 시 상속받는 (built-in) Behaviour 클래스인데, 스크립트 명령(scripting instruction)들의 집합으로 구성되어 있어 유니티 엔진에 의해 호출(invoke) 되는 콜백 함수들을 이용할 수 있게 되는 것입니다.


Editor

 

Reset( )은 에디터에서 처음 컴포넌트를 부착하거나 Reset을 누르면 호출된다.

 


Initialization



1) Awake() : 프리팹이 인스턴스화된 직후 호출됩니다. Reset()된 값들을 사용하기 떄문에 생성자로서의 역할을 안전하게 수행할 수 있습니다. (인스턴스 비활성화 시 수행되지 않음)

2) OnEnable() : Monobehaviour 스크립트를 보유한 인스턴스가 활성화될 때 호출됩니다. (여러 번 호출이 가능하다.)

3) Start() : Awake()가 동작한 이후, Update()가 동작하기 전 호출되는 Initializer입니다. 주로 Awake()에서 동적으로 생성된 요소나 값에 접근하는데 사용합니다. (인스턴스 비활성화 시 수행되지 않음)

 


Physics



1) FixedUpdate() (물리 관련 업데이트 시 이 FixedUpdate()가 권장된다.)
: 프레임과 상관없이 시간(default 0.02s, 변경 가능) 기준으로 호출되는 Update 계열 콜백이기 때문에 주로 물리 엔진을 사용하는 경우 일정 시간 간격으로 힘을 가하거나 체크할 때 사용합니다. 프레임 속도가 기준 시간 속도보다 오래 걸릴 정도로 느려질 경우 한 프레임에서 여러 번 호출 될 수 있습니다.

2) 내부 Physics용 Update()

3) OnTriggerXXX, OnCollisionXXX : 충돌 감지 계열

4) yield return new WaitForFixedUpdate()을 호출한 이전 코루틴 : WaitForFixedUpdate (다음 FixedUpdate()가 실행될 때까지 기다림)

 


Input Events

 

 

- OnMouseXXX 등...

 


Game Logic

 


1) Update() : 1 프레임 당 1회 호출되는 함수

2) 이전 yield return (null || new WaitForSecond() || new StartCoroutine())을 호출한 코루틴
: 각각 1 프레임, 매개변수로 받은 초, 해당 코루틴이 끝날 때까지 기다리게 됩니다.

3) 내부 Animation들의 Update()

4) LateUpdate() : 모든 Update() 계열 콜백이 수행된 이후 사용된다. 카메라 Follow 등에 사용합니다.


Scene Rendering

 


1) OnPreCull() // To 카메라 오브젝트

: OnPreCull은 (scene)의 카메라 컬링(cull)이 이루어 지기 전에 호출됩니다.
컬링은 어떤 오브젝트가 카메라에 보이게 할지를 결정합니다. (절두체 밖이거나, 렌더러가 없는 오브젝트 등)

OnPreCull은 이 과정 바로 전에 호출되며, 카메라에 부착된 스크립트에 전달됩니다.

사용자가 카메라의 파라미터(. fieldOfView or just transform)를 바꾸고 싶은 경우에, 이 기능을 사용합니다.
씬 오브젝트의 가시성(Visibility)은 OnPreCull 호출 이후 카메라의 파라미터를 기반으로 결정됩니다.



2) OnWillRenderObject() // From 카메라 오브젝트 To 렌더러 오브젝트
: 오브젝트가 화면에 보이는 경우에 각각의 카메라가 렌더러 오브젝트에 대하여 호출합니다.
MonoBehaviour가 비활성화 되어있는 경우에 이 함수는 호출되지 않습니다.

이 기능은 컬링된(culled) 모든 오브젝트가 렌더링되기 이전에, 컬링(culling) 과정 중에 호출됩니다.



3) OnBecameVisible() / Invisible() // To 렌더러 오브젝트
: OnBecameVisible은 렌더러가 카메라에 표시될 때 호출됩니다.
OnBecameInvisible은 오브젝트가 카메라에 의해서 더이상 보이지 않는 경우에 호출됩니다.



4) OnPreRender() // To 카메라 오브젝트
: OnPreRender는 (scene)의 카메라 렌더링이 시작되기 전에 호출됩니다.
이 메시지는 카메라 오브젝트의 모든 스크립트로 전달됩니다. 카메라의 파라미터(fieldOfView)를 바꾸는 경우, 다음 프레임부터 영향을 미치게 됩니다. 이 동작을 OnPreCull를 대신 사용하는 방법을 추천합니다.



5) OnRenderObject() // To 씬의 모든 오브젝트
: OnRenderObject는 카메라가 (scene)을 렌더링을 마친 후에 호출됩니다.

Graphics.DrawMeshNow또는 다른 함수를 사용해서 사용자가 자신의 오브젝트를 렌더링 하는 경우에
사용할 수 있습니다
. OnPostRender와는 실행되는 오브젝트에 차이가 있습니다.



6) OnPostRender() // To 카메라 오브젝트
: OnPostRender 또한 카메라가 (scene)의 렌더링을 마친 후에 호출됩니다.
스크립트가 카메라에 첨부되고 활성화 되어 있는 경우에만 호출됩니다.

OnPostRender는 함수안에 간단히 yield 구문을 사용해서 코루틴을 수행할 수 있습니다.
카메라가 렌더링을 완료하고 GUI가 렌더링 된 후에 어떤 작업을 추가로 하고 싶은 경우에는 WaitForEndOfFrame을 사용합니다.



7) OnRenderImage() // To 카메라 오브젝트
: 모든 렌더링이 완료된 후에 렌더 이미지로 OnRenderImage가 호출됩니다.

쉐이더 기반의 필터로 처리하여 최종 이미지를 변경할 수 있습니다.
incoming 이미지는 source 렌더 텍스쳐입니다.
여러 개의 이미지 필터들이 카메라를 거치며, 첫번째 필터의 source에서 next 필터로 destination 전달에 의해 순차적으로 이미지를 처리하게 됩니다.