์ฝ”๋“œ ๊ฐœ๊ฐ™์ด ๊ธธ ์˜ˆ์ •

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์— ํ•œ ์ค„ ๋นผ๋จน์Œ...