using UnityEngine;

using System.Collections;

using System.Collections.Generic;


public abstract class MSObjectPooling<T> : MonoBehaviour where T : Component

{

ย  ย  public GameObject pooledObject;

ย  ย  public int pooledAmount = 5;

ย  ย  public bool willGrow = true;


ย  ย  List<T> pooledObjects = new List<T>();


// Use this for initialization

void Awake ()ย 

ย  ย  {

ย  ย  ย  ย  //pooledObjects = new List<T>();

ย  ย  ย  ย  for (int i = 0; i < pooledAmount; i++)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  GameObject obj = AddChild(gameObject, pooledObject);//(GameObject)Instantiate(pooledObject);

ย  ย  ย  ย  ย  ย  obj.SetActive(false);

ย  ย  ย  ย  ย  ย  pooledObjects.Add(obj.GetComponent<T>());

ย  ย  ย  ย  }

}


ย  ย  public T GetPooledObject()

ย  ย  {

ย  ย  ย  ย  for (int i = 0; i < pooledObjects.Count; i++)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  if (!pooledObjects[i].gameObject.activeInHierarchy)

ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  return pooledObjects[i] as T;

ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  }


ย  ย  ย  ย  if (willGrow)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  GameObject obj = AddChild(gameObject, pooledObject);

ย  ย  ย  ย  ย  ย  var newT = obj.GetComponent<T>();

ย  ย  ย  ย  ย  ย  pooledObjects.Add(newT);

ย  ย  ย  ย  ย  ย  return newT;

ย  ย  ย  ย  }

ย  ย  ย  ย  return null;

ย  ย  }


ย  ย  GameObject AddChild(GameObject parent, GameObject prefab)

ย  ย  {

ย  ย  ย  ย  GameObject go = GameObject.Instantiate(prefab) as GameObject;

#if UNITY_EDITOR

ย  ย  ย  ย  UnityEditor.Undo.RegisterCreatedObjectUndo(go, "Create Object");

#endif

ย  ย  ย  ย  if (go != null && parent != null)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  Transform t = go.transform;

ย  ย  ย  ย  ย  ย  t.parent = parent.transform;

ย  ย  ย  ย  ย  ย  t.localPosition = Vector3.zero;

ย  ย  ย  ย  ย  ย  t.localRotation = Quaternion.identity;

ย  ย  ย  ย  ย  ย  t.localScale = Vector3.one;

ย  ย  ย  ย  ย  ย  go.layer = parent.layer;

ย  ย  ย  ย  }

ย  ย  ย  ย  return go;

ย  ย  }

}


๊ทธ๋ƒฅ ์ƒ์† ๋ฐ›์•„์„œ ์“ฐ๋ฉด๋จ..

using UnityEngine;

using System.Collections;


public class MSEffectPooling : MSObjectPooling<Transform>

{

}


์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์ด ๋ฌด์Šจ ๋Œ€๋‹จํ•œ๊ฑฐ์ฒ˜๋Ÿผ ์• ๋“ค ์™œ์ด๋ฆฌ ํž˜๋“ค๊ฒŒ ๊ณต๋ถ€ํ•˜๋ƒ??

์• ๋“ค์ด ๋ฌด์Šจ ์ฝ”๋”ฉ์—์„œ ์ •๋‹ต์„ ์ฐพ๋„ค..

์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์ด ๋ญ˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„์•ผ์ง€..์œ ๋‹ˆํ‹ฐ์—์„œ ์ด ํ•จ์ˆ˜

public static T Instantiate<T>(T original) where T : Object; ์š”๋„˜์˜ ํ˜ธ์ถœ์„ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์“ฐ๋Š”๊ฑฐ๋‹ค..

์–ด๋–ป๊ฒŒ ์งœ๋Š”์ง€๋Š” ๋ณธ์ธ๋“ค ๋ง˜์ด๋‹ค..์–ด๋ ต๊ฒŒ ํ•˜์ง€๋ง๊ณ  ์ข€ ์‰ฝ๊ฒŒ ํ•˜๊ณ ..์ž…์ฝ”๋”ฉํ•˜์ง€๋ง๊ณ  ์ง์ ‘ ์งœ๋ผ..

๊ทธ๋ฆฌ๊ณ  ์Šคํƒ์œผ๋กœ ํ’€๋ง๊ตฌ์„ฑํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ์‚ฌ์šฉํ•œ๋„˜์ด ๋ฐ˜๋“œ์‹œ ์ฒซ๋ฒˆ์งธ๋กœ ์žฌ์‚ฌ์šฉ์ด ๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ๋˜์–ด์•ผ๋œ๋‹ค..

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์— ํ•œ๊ณ„๊ฐ€ ๋ถ„๋ช…ํžˆ ์กด์žฌํ• ๊ฑฐ๋‹ค..๊ทธ๋Ÿฐ๊ฒƒ๋“ค๋„ ์ž…์ฝ”๋”ฉํ•˜์ง€๋ง๊ณ  ์‹ค์ œ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์•„ ์ด๋Ÿฐ๋ฌธ์ œ๊ฐ€ ์žˆ๋„ค..๊ทธ๋Ÿผ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ์ด๋•Œ๋Š” ์Šคํƒ์œผ๋กœ ํ•˜๊ณ  ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉดย 

๋” ์œ ์—ฐํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋ฐ”๋กœ ์•Œ๊ฒŒ๋˜์ง€..

์—ฌ๊ธฐ์„œ ์ฝ”๋“œ ์•ˆ์“ฐ๊ณ  ํ•œ๊ธ€์“ฐ๋Š”์• ๋“ค์€ ๋‹ค ๊ฐœ์ดˆ๋ณด์ž„..์†”์งํžˆ ์ „ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋Š” ์ฝ”๋”ฉ์œผ๋กœ ์“ฐ๋ฉด ์ดํ•ด๊ฐ€ ๋” ๋น ๋ฅด๊ณ  ์‰ฝ๋‹ค..

๋‚ด๊ฐ€ ์™œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ํ’€๋ง์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€..์™œ ๋ฆฌ์ŠคํŠธ๋กœ ํ–ˆ๋Š”์ง€...์™œ Type์„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ œํ•œํ–ˆ๋Š”์ง€..์ด๋Ÿฐ๊ฒƒ๋“ค์„ ์•Œ์•„๋ณธ๋‹ค๋ฉด ๊ตณ์ด ํ•œ๊ธ€๋กœ ๋Œ€ํ™”ํ• ํ•„์š”๊ฐ€ ์—†๋‹ค..

๋‚ด๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ์ด๊ฑธ ๋งŒ๋“ ์ด ์ด์œ ๊ฐ€ ์“ฐ์ž„์ด ์–ด๋А์ •๋„๊นŒ์ง€๋กœ ์ •ํ–ˆ๋Š”์ง€ ์•Œ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค..