유니티

Object Pool

잼잼재미 2023. 12. 8. 20:12

Object Pool


  • 오브젝트를 미리 생성하고 삭제하지 않고, 재사용 해서 최적화하는 방법
  • 프리팹의 Instantiate, Destroy 함수는 비용이 큼
  • 총알과 같이 자주 생성되고 삭제되는 프리팹에 사용

 

 

ObjectPool 사용
Destroy / Instantiate 사용

 

 

총알 Effect Object Pool 구현


1. 스크립트


ObjectPoolManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPoolManager : MonoBehaviour
{
    public ObjectPool ObjectPool { get; private set; }
    private GameObject _bulletEffectObj;

    public void Init()
    {
        ObjectPool = GetComponent<ObjectPool>();
    }

    public void Release()
    {

    }

    public void GunEffect(string poolName ,Vector3 startPosition, Quaternion rotation)
    {
        _bulletEffectObj = ObjectPool.SpawnFromPool(poolName);

        _bulletEffectObj.transform.position = startPosition;
        _bulletEffectObj.transform.rotation = rotation;
        //RangedAttackController attackController = obj.GetComponent<RangedAttackController>();
        //attackController.InitializeAttack(direction, attackData, this);

        _bulletEffectObj.SetActive(true);
        StartCoroutine(COGunEffectInactive());
    }

    IEnumerator COGunEffectInactive()
    {
        GameObject obj = _bulletEffectObj;

        yield return new WaitForSeconds(0.5f);
        obj.SetActive(false);
    }
}

 

미리 생성된 GameManager과 연결하여 사용

 

 

ObjectPool

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    [System.Serializable]
    public struct Pool
    {
        public string Tag;
        public GameObject Prefab;
        public int Size;
    }

    public List<Pool> Pools;
    public Dictionary<string, Queue<GameObject>> PoolDictionary;

    private void Awake()
    {
    	GameObject objectPoolPrefabs = new GameObject("ObjectPoolPrefabs");
        PoolDictionary = new Dictionary<string, Queue<GameObject>>();
        foreach (var pool in Pools)
        {
            Queue<GameObject> objectPool = new Queue<GameObject>();
            for (int i = 0; i < pool.Size; i++)
            {
                GameObject obj = Instantiate(pool.Prefab, objectPoolPrefabs.transform);
                obj.SetActive(false);
                objectPool.Enqueue(obj);
            }
            PoolDictionary.Add(pool.Tag, objectPool);
        }
    }

    public GameObject SpawnFromPool(string tag)
    {
        if (!PoolDictionary.ContainsKey(tag))
            return null;

        GameObject obj = PoolDictionary[tag].Dequeue();
        PoolDictionary[tag].Enqueue(obj);

        return obj;
    }
}

 

 

2.  설정 방법


 

GameManager에 ObjectPoolManager 오브젝트를 추가하고 스크립트를 연결해준다.

 

 

 

ObjectPoolManager에 ObjectPoolManager, ObjectPool 스크립트를 추가하고 Pools를 설정해준다.

* Size : 게임 실행 시, 생성할 프리팹 수 (최대 동시에 사용할 프리팹 수)

 

 

 

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

애니메이션 이벤트  (0) 2023.12.13
GameObject 검색  (0) 2023.12.11
싱글톤  (1) 2023.12.08
캐릭터 스텟 만들기 (ScriptableObject)  (0) 2023.12.08
사운드 슬라이더 바 만들기  (1) 2023.12.05