[Unity] 유니티 Queue를 이용한 간단한 풀링 시스템 Simple pooling system using Queue
유니티 풀링 시스템
안녕하세요 정보처리마법사 입니다.
이번 포스팅의 주제는 풀링에 관한 내용입니다.
다들 아시다시피 게임을 만들 때 총알이나, 코인같이 생성과 파괴를 엄청나게 많이 반복하는 오브젝트를 생성할때 Instantiate 메서드를 사용해서 구현하면 CPU 리소스를 엄청 먹습니다. 그렇기 땜시 사용하는 게 바로 풀링시스템입니다. 이 간단히 설명을 드리자면, 생성, 파괴, 생성, 파괴의 작업을 활성, 비활성, 활성, 비활성 요로케 사용함으로써 리소스를 덜 사용하게 되는 거죠. 다만 조금 귀찮은 건 활성해서 사용할 때 초기화를 해줘야 한다는 점~!
자 그럼 바로 본론으로 들어가서 소스코드를 봅시다.
아차 그전에, 저기 아래 using DG.Tweening; 요거는 저는 유료로 구입한 Dotween Pro 에셋을 구입해서 Import 한 거지만 Dotween 무료버전을 사용하셔도 무방합니다. 참고 바랍니다.
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Random = UnityEngine.Random;
public class DongleeManager : MonoBehaviour
{
public static DongleeManager Instance;
[Header("Donglee(a.k.a. coin)")]
[SerializeField] GameObject animatedDongleePrefab;
[Header("UI label coil")]
[SerializeField] Transform target;
[Header("pooling capacity")]
[SerializeField] int maxDonglees;
[Header("Animation settings")]
[SerializeField] [Range(.5f, .9f)] float minAnimDuration;
[SerializeField] [Range(.9f, 2f)] float maxAnimDuration;
[Header("Ease type")]
[SerializeField] Ease easeType;
Queue<GameObject> dongleeQueue = new Queue<GameObject>();
Vector3 targetPosition;
private void Awake()
{
Instance = this;
targetPosition = target.position;
PrepareDonglees();
}
void PrepareDonglees()
{
GameObject donglee;
for (int i = 0; i < maxDonglees; i++)
{
donglee = Instantiate(animatedDongleePrefab);
donglee.transform.parent = gameObject.transform;
donglee.SetActive(false);
dongleeQueue.Enqueue(donglee);
}
}
public void AddDonglees(Vector3 targetPos, int amount)
{
DongleeMoveToTarget(targetPos, amount);
}
void DongleeMoveToTarget(Vector3 targetPos, int amount)
{
for (int i = 0; i < amount; i++)
{
if (dongleeQueue.Count > 0)
{
GameObject donglee = dongleeQueue.Dequeue();
donglee.SetActive(true);
donglee.transform.position = targetPos;
float duration = Random.Range(minAnimDuration, maxAnimDuration);
donglee.transform.DOMove(targetPosition, duration)
.SetEase(easeType)
.OnComplete(() =>
{
donglee.SetActive(false);
dongleeQueue.Enqueue(donglee);
DataManager.Instance.donglee++;
});
}
}
}
}
일단 소스코드는 위와 같고, 인스펙터에서는 아래 이미지와 같이 보입니다.
참 쉽죠잉!
이렇게 직접 구현해도 되고, 유니티 에셋스토어에 있는 무료 에셋중에도 풀링 관련 좋은 에셋들 많으니 참고하시기 바랍니다. 이상으로 포스팅을 마칩니다. 감사합니다.
잘 못 된 정보가 있으면 말씀해주세요.
공감버튼 클릭은 작성자에게 큰 힘이 됩니다. 행복한 하루 되세요.
“파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음"