728x90
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
private static ObjectPool instance = null;
private static object _syncObj = new object();
public static ObjectPool Instance
{
get
{
lock (_syncObj)
{
if (instance == null)
{
ObjectPool objs = FindObjectOfType<ObjectPool>();
if (instance == null)
{
GameObject go = new GameObject(name);
instance = go.AddComponent<ObjectPool>();
}
else
{
instance = objs;
}
}
return instance;
}
}
}
private Dictionary<string, Queue<GameObject>> objectPoolDic = new Dictionary<string, Queue<GameObject>>();
// 신규 오브젝트 생성
public GameObject CreateNewObject(GameObject _obj)
{
var newObj = Instantiate(_obj);
newObj.SetActive(false);
newObj.transform.SetParent(transform);
return newObj;
}
// pool 초기화
public void InitializeDic(string strKey, GameObject _obj, int addValue)
{
if (objectPoolDic.ContainsKey(strKey) == false)
{
objectPoolDic.Add(strKey, new Queue<GameObject>());
}
for (int i = 0; i < addValue; i++)
{
objectPoolDic[strKey].Enqueue(CreateNewObject(_obj));
}
}
// pool 꺼내기
public static GameObject GetObject(string strKey, GameObject pObj)
{
GameObject _obj = null;
Instance.objectPoolDic.TryGetValue(strKey, out var getQue);
if (getQue != null)
{
if(getQue.Count > 0)
{
_obj = getQue.Dequeue();
}
else
{
_obj = Instance.CreateNewObject(pObj);
}
_obj.transform.SetParent(null);
_obj.SetActive(true);
}
return _obj;
}
// pool 넣기
public static void ReturnObject(string strKey, GameObject pObj)
{
pObj.SetActive(false);
pObj.transform.SetParent(Instance.transform);
Instance.objectPoolDic.TryGetValue(strKey, out var getQue);
if (getQue == null)
{
Instance.objectPoolDic.Add(strKey, new Queue<GameObject>());
Instance.objectPoolDic[strKey].Enqueue(pObj);
}
else
{
getQue.Enqueue(pObj);
}
}
}
728x90
반응형
'Unity3D > Unity & C#' 카테고리의 다른 글
Unity & C# ~ 시간을 나타내는 법(float to string) (0) | 2023.11.03 |
---|---|
Unity & C# ~ 한/영 전환 하는 클래스 (0) | 2023.06.29 |
Unity & C# ~ 이미지 파일을 로드하여 스프라이트로 만들기 (Image file Load to Sprite) (0) | 2023.03.14 |
Unity & C# ~ JsonConvert 사용법 (0) | 2023.02.24 |
Unity & C# ~ Additive Load된 씬의 라이팅 세팅 가져오는 법 (0) | 2023.02.09 |