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