Unity

[Unity] 유니티 Queue를 이용한 간단한 풀링 시스템 Simple pooling system using Queue

정보처리마법사 2020. 6. 26. 00:58
반응형

 

 

 

 

 

[Unity] 유니티 Queue를 이용한 간단한 풀링 시스템 Simple pooling system using Queue

 

 

 

유니티 풀링 시스템

 

 

 

 

이모티콘・01・고양이 마멋 친구들 - Google Play 앱

이모티콘・01・고양이 마멋 친구들: 무료 이모티콘, 회원가입 없이! 카톡, SNS로 감정 표현이 쉬워져요. 귀여움 가득, 대화창을 더 풍성하게!

play.google.com

 

 

 

 

안녕하세요 정보처리마법사 입니다.

 

이번 포스팅의 주제는 풀링에 관한 내용입니다.

 

다들 아시다시피 게임을 만들 때 총알이나, 코인같이 생성과 파괴를 엄청나게 많이 반복하는 오브젝트를 생성할때 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++;
                    });
            }
        }
    }
}

 

일단 소스코드는 위와 같고, 인스펙터에서는 아래 이미지와 같이 보입니다.

 

참 쉽죠잉!

 

이렇게 직접 구현해도 되고, 유니티 에셋스토어에 있는 무료 에셋중에도 풀링 관련 좋은 에셋들 많으니 참고하시기 바랍니다. 이상으로 포스팅을 마칩니다. 감사합니다.

 

 

 

 

 

 

잘 못 된 정보가 있으면 말씀해주세요.

공감버튼 클릭은 작성자에게 큰 힘이 됩니다.  행복한 하루 되세요.

 

“파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음"

반응형