์ฝ๋ ๊ฐ๊ฐ์ด ๊ธธ ์์
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewObjectPool : Singleton<NewObjectPool> { [System.Serializable] public class PoolInfo { public GameObject poolObject; public int start; public int add; public PoolInfo(GameObject _poolObject, int _start, int _add) { poolObject = _poolObject; start = _start; add = _add; } public bool MemberCheck() { return poolObject != null && start != 0 && add != 0; } } [SerializeField] PoolInfo[] poolInfos; Dictionary<string, PoolInfo> poolInfoDic = new Dictionary<string, PoolInfo>(); Dictionary<PoolInfo, Queue<GameObject>> poolDic = new Dictionary<PoolInfo, Queue<GameObject>>(); Transform active; Transform deactive; protected override void Awake() { base.Awake(); ActiveNoneActiveSet(); AwakePoolInfoSet(); } private void ActiveDeActiveSet() { active = new GameObject("activePool").transform; deactive = new GameObject("deactivePool").transform; active.gameObject.SetActive(true); deactive.gameObject.SetActive(false); } private void AwakePoolInfoSet() { if(poolInfos.Length>0) { foreach(PoolInfo poolInfo in poolInfos) { if(poolInfo.MemberCheck()) { if (ReturnableCheck(poolInfo.poolObject)) { continue; } if (PoolInfoSearch(poolInfo.poolObject)==null) { poolInfoDic.Add(poolInfo.poolObject.name, poolInfo); poolDic.Add(poolInfo, new Queue<GameObject>()); for (int i = 0; i < poolInfo.start; i++) { GameObject go = Instantiate(poolInfo.poolObject, deactive); poolDic[poolInfo].Enqueue(go); } } } } } } public PoolInfo PoolInfoSet(GameObject gameObject, int start, int add) { PoolInfo poolInfo = PoolInfoSearch(gameObject); if (poolInfo!=null) { return poolInfo; } if(ReturnableCheck(gameObject)) { return null; } poolInfo = new PoolInfo(gameObject, start, add); poolInfoDic.Add(poolInfo.poolObject.name, poolInfo); poolDic.Add(poolInfo, new Queue<GameObject>()); for (int i = 0; i < poolInfo.start; i++) { GameObject go = Instantiate(poolInfo.poolObject, deactive); poolDic[poolInfo].Enqueue(go); } return poolInfo; } private bool ReturnableCheck(GameObject gameObject) { bool isReturnable = gameObject.GetComponent<IReturnable>() != null; if(!isReturnable) { Debug.Log("์ค๋ธ์ ํธ ํ์ ์ ํฉํ์ง ์์ ์ค๋ธ์ ํธ"); } return isReturnable; } public PoolInfo PoolInfoSearch(GameObject gameObject) { if(poolInfoDic.ContainsKey(gameObject.name)) { return poolInfoDic[gameObject.name]; } return null; } private void Add(PoolInfo poolInfo) { Queue<GameObject> queue = poolDic[poolInfo]; for(int i = 0; i < poolInfo.add; i++) { GameObject go = Instantiate(poolInfo.poolObject, deactive); queue.Enqueue(go); } } #region CallMethod public Transform Call(PoolInfo poolInfo,Vector3 positon, Vector3 rotate) { Queue<GameObject> pool = poolDic[poolInfo]; if(pool.Count == 0) { Add(poolInfo); } Transform callObject = pool.Dequeue().transform; callObject.position = positon; callObject.rotation = Quaternion.Euler(rotate); callObject.SetParent(active); return callObject; } public Transform Call(PoolInfo poolInfo, Vector3 positon) { Queue<GameObject> pool = poolDic[poolInfo]; if (pool.Count == 0) { Add(poolInfo); } Transform callObject = pool.Dequeue().transform; callObject.position = positon; callObject.SetParent(active); return callObject; } public Transform Call(PoolInfo poolInfo) { Queue<GameObject> pool = poolDic[poolInfo]; if (pool.Count == 0) { Add(poolInfo); } Transform callObject = pool.Dequeue().transform; return callObject; } #endregion public void Return(GameObject gameObject, PoolInfo poolInfo) { gameObject.transform.SetParent(deactive); poolDic[poolInfo].Enqueue(gameObject); } }์๋๋ ์ธ์คํํฐ ์์์ ๋ฏธ๋ฆฌ ์ง์ด๋ฃ๋ ๋ฐฉ์์ผ๋ก ์ผ๋๋ฐ
๊ฐํ์ฐธ์กฐ๋ฅผ ํ๋ฉด ๋ฌด์กฐ๊ฑด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค๊ธธ๋
์์ ํ์ํ ํ๋ฆฌํฉ์ ๋นผ๊ณ ๋ ๊ทธ๋๊ทธ๋
ํ์ํ ํ์ ์ค๋ธ์ ํธ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ ์์ฑํ๊ฒ ๋ง๋ค์์
๋ง์ฝ์ ์ธ๋ถ์์ ํ ์์ฑ ๋ช ๋ น์ ์ค๋ค๋ฉด PoolInfo๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ธ์ ํธ ํ๋งํ ํ๋ฅผ ๋ง๋ค๊ณ
๊ทธ ํ์์ ๋ถ๋ฌ์ค๋ Call๋ฉ์๋์ ํ์ํ ๋งค๊ฐ๋ณ์ PoolInfo๋ฅผ ๋ฐํํ ๊ฑฐ์.
IReturnable์ ํ๋ก ์์ฑํ ์ ๋ค์ ํ๋ก ๋์์์ผํ ๊ธฐ๋ฅ์ด ํ์ํ๋๊น ์ธํฐํ์ด์ค๋ก ๋ง๋ค๊ณ
ํด๋น ์ธํฐํ์ด์ค๊ฐ ์๋ ์ ๋ค์ ํ๋ก ์์ฑ ๋ชปํ๊ฒ ๋ง์๋
active๋ Deactive๋ ์๋ณธ ์ค๋ธ์ ํธ๋ค ํ์ฑ ๋นํ์ฑํ ์ฒดํฌํ๊ธฐ ๊ท์ฐฎ์์ ๊ทธ๋ฅ ๋๋ฐฉ์ผ๋ก ์ฒ๋ฆฌํ์
์๋ง ๋ ์ต์ ํ ์ํค๋ ค๋ฉด ์๋ณธ์ค๋ธ์ ํธ๋ค ๋ค ๋นํ์ฑํ ์์ผ์ฃผ๊ณ SetParent๋์ ์ SetActive๋ก ์ฒ๋ฆฌํ๋ฉด ๋ ๋ฏ
์์ง ๋ฐฐ์ฐ๋ ์ค์ด๋ผ ์ด๊ฒ์ ๊ฒ ๋ง๋ค์ด์ ์ฐ๊ณ ์๋๋ฐ
๋ง์ ๋ง๋ค๊ณ ๋๋๊น ์ ๋ํฐ์์ ์ค๋ธ์ ํธ ํ๋ง ์ง์ํ๋ค๋๋ฐ ์ ํ๋ง ๊ฒ์ํ๋ฉด ๋ง๋๋๊ฒ๋ง ๋์ค๊ณ ์์ฒด ์ง์ํ๋๊ฑด ๋์ค์ง ์๋
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฉด์ ๋ดค๋๋ฐ Call์ ํ ์ค ๋นผ๋จน์...
๋๊ธ 0