#1. Object Pooling에서 생긴 일

Unity/Bug Report

2020. 8. 17. 16:48

현재 자그마한 무한 런 게임을 만들고 있다. 내가 맡은 파트는 Spawner .. 즉 장애물을 무한정 스폰하는 것. 

당연하지만 최적화를 위해서는 오브젝트 풀링이 필요하다. 오브젝트 풀링의 원리는 굉장히 간단하다.

 

  1. 오브젝트 풀을 싱글톤으로 생성한다. ( 오브젝트가 오브젝트 풀 함수에 접근해야 하기에..)
  2. 미리 적당한 양의 오브젝트를 생성해 큐나 리스트에 넣어둔다. ( 뭘 쓰던 상관없는 것은 추가나 삭제가 이뤄지지 않기 때문)
  3. 적당한 조건에 ( 일정시간마다,특정버튼입력) 풀에서 오브젝트를 꺼내어 동작시킨다.
  4. 적당한 조건에 ( 일정시간후에,특정물체충돌) 풀에 반환한다.

 

정말 간단하지만 나같은 실수를 하는 사람들을 위해서 글을 남긴다. 

 

 

일단 오브젝트 풀링은 유니티의 Instantiate가 런타임에 호출되면 성능 저하가 발생하기때문에 미리 만든후 SetActive를 통해서 비활성화를 시켜두고 다시 사용할 때 활성화를 시켜준다. 중요한건 활성화/비활성화인데 Awake,Start,OnEnable중 어떤 것을 사용해서 초기화를 시켜야 하냐는 것이다. 

 

결론부터 말하자면 OnEnable을 사용해야 한다. 또는, 특정한 초기화 함수를 만들어두고 SetActive 될 때마다 호출을 해주어야 한다. Awake는 Active가 비활성화인 상태에서도 동작하며 Start는 비활성화 상태에서 실행되지 않는다. 하지만 둘 다 단 한 번의 활성화 상태에서만 동작을 하기 때문에, 오브젝트 풀에 다시 들어간 후 나올 때 Active가 활성화 된다고 해도 동작되지 않는다. 반면에, OnEnable은 Active가 활성화 될 때마다 동작하기 때문에 이에 적절하다.

 

금방 검색만해도 차이를 알 수있고, 당연하게 적용시켜야 할 문제를 이토록 오랜시간 잡고 풀어헤친것은 다름아닌 Coroutine 녀석 때문이다. 처음에 게임 속도가 느려지는 것 때문에 최적화 문제를 뒤적이다가 Update 보다는 Coroutine을 사용해야 한다는 것을 권장해서 바로 수정을 했었다. 이 과정에서 Start가 먹통이 됐고 앞으로 나아가야 할 장애물들이 동작을 하지 않게 됐다. 어느정도 단위로 수정을 하고 테스트를 해야하는데 뭉텅이로 수정을하다 보니 .. 그리고 입력 값을 좀 크게 잡았더니 처음에 문제가 발생하지 않은점 때문에 무엇이 문제인지 너무 오랜시간을 해맨것 같다 ㅜ..

 

그래도 이걸 끝으로 핵심적인 기능 구현은 끝났다. 토이 프로젝트 정도로 생각하고 있었는데 생각보다 시간이 좀 걸려서 골치가 아픈듯 ㅜㅜ. 일단 남은 방학기간은 이 프로젝트를 끝낸다는 마인드로 가야겠다.

'Unity > Bug Report' 카테고리의 다른 글

git & avast anti virus  (0) 2020.09.05
Object Pooling & SceneManager  (0) 2020.09.05