using System.Collections.Generic;
using UnityEngine;

public class ObjectPool<T> :MonoBehaviour{
protected Stack<T> ObjectStack=new Stack<T>();
public GameObject Prefap;
private void Start() {
for(int i=0;i<transform.childCount;i++){
ObjectStack.Push(transform.GetChild(i).GetComponent<T>());
}
}
public virtual T GetObj(){
if(ObjectStack.Count>0){
return ObjectStack.Pop();
}
else{
var copy=Instantiate(Prefap);
copy.transform.SetParent(transform);
copy.transform.localScale=Vector3.one;
return copy.GetComponent<T>();
}
}
public virtual void ReturnObj(T obj){
if(!ObjectStack.Contains(obj))ObjectStack.Push(obj);
}
}


์“ธ๊ฑฐ๋ฉด ์ €๊ฑฐ ๋„ฃ๊ณ 

public class ButtonPool: ObjectPool<Button>

์ด๋Ÿฐ์‹์œผ๋กœ ์ƒ์†๋ฐ›์„ ํด๋ž˜์Šค ๋งŒ๋“ค์–ด์ค€ ๋‹ค์Œ

์ƒ์†๋ฐ›์„ ํด๋ž˜์Šค๋ฅผ ์•„๋ฌด ์˜ค๋ธŒ์ ํŠธ์— ๋„ฃ์–ด๋†“๊ณ ย 

ํด๋งํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ”„๋ฆฌํŒน์œผ๋กœ ๋งŒ๋“ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ์— ํ• ๋‹น๋งŒ ํ•ด์ฃผ๋ฉด ๋๋‚จ


์˜ˆ์‹œ์—๋Š” Button์œผ๋กœ ํ–ˆ์œผ๋‹ˆ๊นŒ ์ €๊ฒฝ์šฐ๋Š” Button์ด ํฌํ•จ๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ”„๋ฆฌํŒน์œผ๋กœ ํ•ด์ค˜์•ผํ•จ


GetObj(); ๋กœ ์˜ค๋ธŒ์ ํŠธ ๊ตฌํ•ด์˜ค๊ณ 


์˜ค๋ธŒ์ ํŠธ ๋‹ค ์“ฐ๋ฉด

transform.parent.GetComponent<ButtonPool>().ReturnObj(this);

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋จ