본문 바로가기

유니티 게임 개발하기/2D 게임 개발일지

유니티 - 탄막 슈팅 게임을 만들자 (8) - 몬스터를 관리하는 오브젝트 풀링!

안녕하세요! 윈디입니다.


최근에는 조금씩 시간을 내서

 잡몹들을 만들어서 전반적인 스테이지를 만들고 있습니다.

▲스테이지 매니저 스크립트에서 이전에 설명드렸던 iTween path 를 사용하여,

 잡몹들이 나올 전반적인 위치나, 패턴을 관리하고 있죠.


그런데 저 움짤을 자세히 봐 주세요. 계속해서 똑같은 몬스터들이 나오는 상황입니다.

이런 상황에서 굳이 저 잡몹들의 삭제/생성을 반복할 필요가 있을까요?


차라리, 미리 10개정도의 잡몹 오브젝트를 생성해 놓고 죽을 때마다 삭제가 아니라 비활성화시켜서 필요할 때마다 재활용한다면...?

이라는 생각에, 오늘은 '오브젝트 풀링'을 사용해 보았습니다.


1. 오브젝트 풀링이란?


  오브젝트 풀링이란, 사용이 끝난 객체를 삭제하지 않고 저장해 두었다가, 필요할 떄가 오면 다시 사용하는 식의 개발 방법입니다.

  보통, 오브젝트를 생성/삭제할 때는 시간이 많이 소모되는데요,(변수, 객체 자체 등등등..) 이러한 과정을 생략하고 이전 오브젝트를 바로 끌  어다 쓸 수 있다는 점이 가장 큰 장점이죠. 사용방법은 사용하시는 언어나, 툴마다 다르겠지만, 유니티는 간단하게 활성화/비활성화를 할 수   있으니까, 오브젝트 풀링도 상당히 간단합니다.


  특! 히! 


유니티에서 사용하는 코딩 툴인 MonoDevelop 같은 경우엔, 객체가 한번 삭제되고 나면 언젠가는 GC, 즉 가비지 콜렉터가 발생합니다.

해제된 메모리들을 정리하는 시스템인데요, 생성/ 삭제 자체에도 부하가 많이 걸리지만, GC가 계속적으로 발생하면 더욱 비효율적이겟죠.


즉, 오브젝트 풀링을 하면 '메모리 관리에 필요한 시간이 그만큼 줄어듭니다.'


굳이 게임에서만 쓰일 스킬이 아니고, 어디서든 사용할 수 있는 스킬인 거 같아요.


제 경우 탄들이야 얼마나 필요할지 실제로 알 수 없기 때문에 오브젝트 풀링은 거의 불가능합니다만.. 위의 짤처럼 자주 사용되는 잡몹들 같은 경우에는 굳이 하나하나 생성, 삭제를 해서 과중한 부하를 줄 필요가 없습니다. 

미리미리 만들어 놓고 오브젝트 풀링을 사용하여 계속해서 재활용하는게 좋을 거 같아요.






2. 오브젝트 풀링을 적용해 보자.






물론, 오브젝트 풀링이니까 계속 재활용할 오브젝트 풀이 필요하겟죠!

첫번째로 오브젝트 풀을 만듭니다.


다음은 스테이지 매니저에 이 오브젝트들을 배열로 등록합니다!

이제 zaco1 [i] 로 각 오브젝트에 접근할 수 있게 되었습니다.




스테이지 매니저 내부에서 오브젝트들을 배열로 사용할 수 있게 되었네요.

하지만, 이것들만으로는 정말 단순히 등록해서 사용하는 것 밖에 할 수가 없습니다.

 생성, 삭제가 아니라 이미 있던 것들에 명령을 내리는 것뿐이니까요.


이제 몬스터들이 죽거나 생성되는 시점을 찾아서, 활성화/비활성화로 만들어 보겠습니다.


잡몹들이 필드 위에 생성되었다가, 사라지는 경우는 다음의 두가지가 있습니다.



1. 플레이어에게 파괴당한다

2. 자신의 임무를 다 하고 살아서 도망친다


1번일 때는, 당연히 몬스터가 죽는 곳의 코드로 가서 이를 수정해 줍니다.

죽고 나면 hp를 다시 2 부여하고, 비활성화시킨 상태에서 충돌 콜라이더를 활성화시켜 줍니다.

이렇게 하지 않으면, 왠진 모르겠지만 나중에 다시 활성화시켜도 충돌 콜라이더는 활성화가 안 되더라구요.




2번일 때는, 임무를 마쳤을 때 똑같은 부분을 추가해 주면 되겠습니다.

새로운 임무를 줄 때는 맨 앞에 부분처럼 스폰될 위치를 조정해 주고 활성화 시키시는 것, 잊지 마세요!




위의 코드를 이용해 만들어진 오브젝트 재활용 영상입니다.

사실 맨 처음에 보여드린거랑 똑같습니다! 이때 미리 만들어 뒀거든요!

처음 10마리, 다음 10마리는 동일한 오브젝트랍니다.



(너무 어려우시면 집에서 어머니에게 만들어 달라고 부탁해 보세요~ 아저씨는 미리 만들어왔어용!)



누구나 필수적으로 하는 간단한 오브젝트 풀링이지만..

실제로 공부하고 적용해 봄으로써 

 좀더 메모리를 절약할 수 있었습니다! 제가 만든 게임에 조금 더 자부심이 생기네요.

오브젝트 풀링도 좀더 이해할 수 있는 계기가 된 것 같구요.

 좀더 열심히 해야겠다는 생각이 듭니다!