유니티 내장 Pool을 쓰면서 재사용 시 초기화 순서가 많이 헷갈려 원하는대로 컨트롤이 힘들었다.

로그를 찍어가면서 확인한 결과 알게된 것을 정리해본다.

 

[최초 생성 시] ObjectPool.Get()   Awake() OnEnable() ActionOnGet() Start()

 

[재활용 시] ObjectPool.Get() ActionOnGet() 안에서 gameObject.SetActive(true)하면 즉시 OnEnable()

 

유니티에서 setActive(true) 호출하면 OnEnable()이 호출되는 것을 알고있어야한다.

최초생성시에는 Get()과 동시에 생성되면서 gameObject의 awake -> OnEnable 사이클을 타지만,

재활용 시에는 ActionOnGet 먼저 호출되고 그 안에서 SetActive() 호출 시 -> OnEnable()이 호출되는 흐름을 타게된다. 최초생성시와는 다르게 이미 생성된 오브젝트를 재사용하는거라 Start()는 호출되지 않는다.

물론 이 순서도 ActionOn--() 안에서 SetActive()을 쓰지 않으면 바뀐다.

 

대개 ObjectPool.Get() 이후에 transform pos나 rotation 값을 넣어주는데 이 부분은 사이클의 맨 마지막에 들어오기 때문에 ActionOnGet(), OnEnable()에서 아무리 바꿔도 소용이 없는 것이다.

 

아래 코드를 보자.

 

 

 

Pool.Get() 에서 연달아 호출되는 메서드에서 position을 정해도 다음 줄에서 Vector3.zero로 바뀌는 모습이다.

주의해서 사용하자

 

 

 

 

 

 

#unity

+ Recent posts