유니티에서 생성과 파괴는 생각보다 무거운 작업이다. 그래서 많은 오브젝트를 빠르게 생성할수록 프로그램은 부하가 걸릴 것이다. 그래서 사용하는 것이 Object Pooling이다.

Object Pooling은 미리 오브젝트를 게임 시작할 때에 만들어두고 필요할 때마다 미리 만들어 두었던 오브젝트를 가져와 사용하는 기법이다.

 

https://notminseodevelop.tistory.com/7?category=901556 

 

2022년 01월 03일 Unity 개인 공부 1일차

구현한 것 - GetAxisRow 함수를 이용하여 플레이어 이동 구현 - 탄젠트 성질을 이용하여 Bullet이 생성될 때 마우스 포인터의 위치를 바라보도록 각도 지정 - CameraShake 기능을 구현하여 총알을 발사할

notminseodevelop.tistory.com

저번 글에서 총알 발사를 구현할 때 나는 총알을 생성하고 1초뒤에 파괴하는 식으로 구현을 했었다.

이것을 Object Pooling 기법을 이용해 조금 더 효율적으로 프로그램을 짜 보도록 하겠다.

 

전체적인 프로그래밍은 https://youtu.be/tdSmKaJvCoA 이 영상을 참고하여 만들었다.

 

그렇게 해서 만들어진 오브젝트 풀링 시스템이다.

Pool이라는 클래스를 어떤 오브젝트인지 구분해주는 tag와 생성할 오브젝트를 저장하는 prefab 그리고 처음 생성할 때 총 몇 개를 생성할 것인지 저장하는 size 총 3개의 변수가 구성되도록 만들었다.

 

List를 public으로 생성하면 인스펙터 창에서 이런식으로 직접 생성을 할 수 있다.

Start()에서는 이런식으로 저장된 List들을 모두 불러와 tag별로 Queue를 만들어 저장하는 작업을 진행해준다.

SpawnFromPool()에서는 매개변수로 무슨 오브젝트인지 구별해주는 tag, 어느 위치에 어느 방향으로 생성할 것인지를 받는다. 처음에 예외처리로 tag가 존재하는지 확인하고 만약 내가 준비해둔 오브젝트들을 다 썼을 때 추가로 생성하는 코드를 짰다. 그 이후로 아까 Queue에 저장돼있던 오브젝트를 꺼내와서 매개변수로 받아온 위치와 방향으로 설정해 생성해준다.

InputToPool()은 총알처럼 특정 조건이 되면 사라져야하는 오브젝트를 구현할 때 사용하는 함수로 다시 Queue에 함수를 넣고 지워준다.

총알을 예시로 Object Pooler 시스템을 사용하는 예시 코드를 보여주겠다.

총알 생성 코드
총알 삭제 코드

16~21번째 줄 코드처럼 생성하면 어떤 파일에서든지 GetComponent<>()를 사용하지 않고도 한 줄로 쉽게 접근할 수 있다. 이와 관련된 내용을 싱글톤 패턴이라고 하는데 찾아보면 도움이 많이 된다.

그렇게 해서 조금더 효율적으로 수정된 게임의 결과물이다.

총알 10개가 게임 시작과 동시에 생성
준비된 오브젝트가 부족할 때 추가되는 총알들

느낀 점

이런 기법들을 배울 때마다 어떻게 사람들은 이렇게 창의적인 생각을 할 수 있는 거지라고 감탄을 금치 못한다.

이런 기법들을 배우고 실제로 내 게임에 활용할 때 꾸준히 개발을 할 수 있게 해주는 '재미'를 느끼게 된다.

앞으로도 조금 더 효율적이고 재미있는 게임을 만들기 위해 더 노력해야겠다.

'유니티 개발' 카테고리의 다른 글

Danma 완성  (1) 2022.04.05
유니티 개발 현황 #2  (0) 2022.02.19
유니티 개발 현황 ( 탄막 패턴, 버그 )  (0) 2022.01.30
2022년 01월 03일 Unity 개인 공부 1일차  (0) 2022.01.03

+ Recent posts