반응형



*Start와 Awake와 OnEnable


기본은 유니티 매뉴얼(https://docs.unity3d.com/Manual/ExecutionOrder.html ) 과동일한 순서라고 생각하면 됨.





Awake는 게임오브젝트가 유니티 내부에서 Instantiate될때 첫 호출되고, Start는 모든 오브젝트의 Instantiate가 마무리된 후에 호출된다.




그런데, 오브젝트 풀링 등을 이용하기 시작하면서 헷갈리는 문제가 발생하기 시작함.


오브젝트 풀링은 보통 gameObject.setActive(true) 와 setActive(false)를 이용하여 필요한 오브젝트를 여러번 Instantiate 하지 않고 재활용하는게 요점인데,


여기서부터 Awake, Start, OnEnable, OnDisable 호출 순서가 점점 골치아파지기 시작하는거지.



------------------------------------


본론으로 들어가기 전에 확실하게 짚고 넘어가야 하는 부분은 이거임.


1. gameObject.SetActive(false)

2. this.enabled = false


는 완전히 다르다는 점이다!


뭐가 다른 것인가 하면





gameObject.SetActive와 this.enabled는 위 캡쳐의 1번 2번 각각에 대해 대응된다고 생각하면 됨.


게임 오브젝트 자체를 disable시키느냐, 게임오브젝트 속의 스크립트 컴포넌트 하나를 disable시키느냐의 차이라고 이해하자.


그럼 이게 Awake, Start, OnEnable과 무슨 상관일까?


-----------------------------------------


경우 1) 게임오브젝트가 Disabled 상태일때


위 스샷의 1번 체크박스를 Disable시켜둔 프리팹, 또는 씬 속의 게임오브젝트가 있다고 치자. 

예를 들어 이펙트를 씬에다 갖다놓고, disable 상태로 게임을 시작했다가, 플레이어가 적을 히트하는 등의 특정 행동에 다다르면 이펙트를 enable시켜서 재생하는 경우를 생각할 수 있겠다.


이 경우에는 게임오브젝트가 활성화되지 않은 것으로 간주, Awake가 호출되지 않는다. 즉, Awake는 게임오브젝트의 활성화 여부에 따라 호출된다.


게임 오브젝트가 애초에 비활성화 상태니, 그 하위 컴포넌트들의 초기화 함수인 Start 역시 호출되지 않는다. 


즉, 

A) 게임오브젝트를 비활성화한 상태로 게임을 시작하면, 또는

B) 프리팹 설정에서 1번 체크박스를 꺼놓은 프리팹을 게임 중에 Instantiate(prefab) 으로 생성할 경우,


Awake도, Start도, OnEnable도 모두 호출되지 않는다.


경우 2)게임오브젝트가 Enabled지만 컴포넌트는 Disabled 상태일때


위 스샷의 1번 체크박스는 켜져 있지만, 2번 체크박스는 꺼진 상태를 뜻한다.


이 경우 일단 게임오브젝트 자체는 활성화되어 있기에, Awake는 호출된다.


그러나 OnEnable() 과 Start()는 호출되지 않는다. 이 두 함수는 컴포넌트의 활성화 여부에 따라 호출된다.


게임이 돌아가는 도중에 체크박스를 켜거나 GetComponent<Component>().enabled = true 설정을 하면, 그 이후 OnEnable과 Start가 호출되게 된다.




전체적으로 재정리하면 다음 그림과 같다.








http://blog.naver.com/1mi2/220928872232 중에서



반응형

+ Recent posts