오브젝트 풀링은, 게임 내에서 계속해서 재활용되는 오브젝트들을 Instantiate/Destroy 하지 않고, 컨테이너에 그 오브젝트들을 넣은 후 SetActive를 통해서 오브젝트의 생성,파괴를 연출하는 방법이다.
오브젝트가 생성되고 파괴될 때 Instantiate/Destroy를 사용하게 되면 성능 소모와 프레임 저하가 발생할 수 있기 때문이다.
코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPooling : MonoBehaviour
{
[SerializeField] private GameObject objectPrefeb;
Queue<GameObject> ObjectPool = new Queue<GameObject>(); //오브젝트를 담을 큐
public static ObjectPooling instance = null;
void Awake()
{
if (null == instance)
{
instance = this;
DontDestroyOnLoad(this.gameObject);
for (int i = 0; i < 30; i++)
{
CreateObject(); //초기에 30개의 오브젝트를 생성함
}
}
else
{
Destroy(this.gameObject);
}
}
GameObject CreateObject() //초기 OR 오브젝트 풀에 남은 오브젝트가 부족할 때, 오브젝트를 생성하기위해 호출되는 함수
{
GameObject newObj = Instantiate(objectPrefeb,instance.transform);
newObj.gameObject.SetActive(false);
return newObj;
}
public GameObject GetObject() //오프젝트가 필요할 때 다른 스크립트에서 호출되는 함수
{
if (ObjectPool.Count > 0) //현재 큐에 남아있는 오브젝트가 있다면,
{
GameObject objectInPool = ObjectPool.Dequeue();
objectInPool.gameObject.SetActive(true);
objectInPool.transform.SetParent(null);
return objectInPool;
}
else //큐에 남아있는 오브젝트가 없을 때 새로 만들어서 사용
{
GameObject objectInPool = CreateObject();
objectInPool.gameObject.SetActive(true);
objectInPool.transform.SetParent(null);
return objectInPool;
}
}
public void ReturnObjectToQueue(GameObject obj) //사용이 완료 된 오브젝트를 다시 큐에 넣을때 호출 파라미터->비활성화 할 오브젝트
{
obj.gameObject.SetActive(false);
obj.transform.SetParent(instance.transform);
instance.ObjectPool.Enqueue(obj); //다시 큐에 넣음
}
}
오브젝트 풀링 방법은 초기에 메모리를 할당해야 하기 때문에, 메모리적인 부분에서 희생을 하게 되지만, 그 이후에 성능적으로 프레임 차이가 그냥 생성/파괴하는것보다 훨씬 좋아지기 때문에 사용이 된다.
특히나 오브젝트가 많으면 많을수록 더 효과가 있는 방법이다.
'유니티' 카테고리의 다른 글
[유니티] 상속을 통해서 몬스터 구현해보기 (0) | 2022.10.23 |
---|---|
[유니티] 반복되는 배경을 사용해서 런닝게임 기초 만들기(무한 스크롤링) (2) | 2022.09.23 |
[유니티]Firebase Database를 이용해서 유저들이 가입한 후 채팅하는 어플 만들기 (2) | 2022.09.16 |
[유니티]TextmeshPro 사용 시 한글이 깨질 때 (0) | 2022.09.14 |
[유니티] Firebase Database를 이용한 회원가입, 로그인 구현 (0) | 2022.09.14 |