using UnityEngine; using System.Collections; using System.Collections.Generic; public class ObjectPoolManager : MonoBehaviour{ private static bool disablePooling=false; public bool showUninitiatedPoolWarning=false; public List poolList=new List(); public static ObjectPoolManager instance; void Awake(){ if(instance!=null && instance!=this){ Debug.Log("Error, there are multiple instance of ObjectPoolManager in the scene"); return; } instance=this; } public static void Init(){ if(instance!=null) return; instance=(ObjectPoolManager)FindObjectOfType(typeof(ObjectPoolManager)); if(instance==null){ GameObject obj=new GameObject(); obj.name="ObjectPoolManager"; instance=obj.AddComponent(); } } public static void ClearAll(){ //not in used for(int i=0; i(); } public static Transform GetOPMTransform(){ return instance.transform; } public static Transform Spawn(Transform objT, float activeDuration=-1){ return Spawn(objT.gameObject, Vector3.zero, Quaternion.identity, activeDuration).transform; } public static Transform Spawn(Transform objT, Vector3 pos, Quaternion rot, float activeDuration=-1){ Init(); return instance._Spawn(objT.gameObject, pos, rot, activeDuration).transform; } public static GameObject Spawn(GameObject obj, float activeDuration=-1){ return Spawn(obj, Vector3.zero, Quaternion.identity, activeDuration); } public static GameObject Spawn(GameObject obj, Vector3 pos, Quaternion rot, float activeDuration=-1){ Init(); return instance._Spawn(obj, pos, rot, activeDuration); } public GameObject _Spawn(GameObject obj, Vector3 pos, Quaternion rot, float activeDuration=-1){ if(obj==null){ Debug.LogWarning("NullReferenceException: obj unspecified"); return null; } if(disablePooling){ GameObject objInstance = Instantiate(obj, pos, rot); if(activeDuration>0) Destroy(objInstance, activeDuration); return objInstance; } int ID=GetPoolID(obj); if(ID==-1){ if(showUninitiatedPoolWarning) Debug.LogWarning("ObjectPoolManager: trying to spawn uninitiated object ("+obj+"), creating new pool"); ID=_New(obj); } GameObject spawnedObj=poolList[ID].Spawn(pos, rot); if(activeDuration>0) StartCoroutine(UnspawnRoutine(spawnedObj, activeDuration)); return spawnedObj; } IEnumerator UnspawnRoutine(GameObject spawnedObj, float activeDuration){ if(activeDuration>0) yield return new WaitForSeconds(activeDuration); Unspawn(spawnedObj); } public static void Unspawn(Transform objT, float delay){ Init(); instance.StartCoroutine(instance.UnspawnRoutine(objT.gameObject, delay)); } public static void Unspawn(GameObject obj, float delay){ Init(); instance.StartCoroutine(instance.UnspawnRoutine(obj, delay)); } public static void Unspawn(Transform objT){ Init(); instance._Unspawn(objT.gameObject); } public static void Unspawn(GameObject obj){ Init(); instance._Unspawn(obj); } public void _Unspawn(GameObject obj){ if(disablePooling){ Destroy(obj); return; } for(int i=0; i inactiveList=new List(); public List activeList=new List(); public int cap=1000; public GameObject Spawn(Vector3 pos, Quaternion rot){ GameObject obj=null; if(inactiveList.Count==0){ obj=(GameObject)MonoBehaviour.Instantiate(prefab, pos, rot); } else{ obj=inactiveList[0]; obj.transform.parent=null; obj.transform.position=pos; obj.transform.rotation=rot; obj.SetActive(true); inactiveList.RemoveAt(0); } activeList.Add(obj); return obj; } public bool Unspawn(GameObject obj){ if(obj==null) return false; if(activeList.Contains(obj)){ obj.SetActive(false); obj.transform.parent=ObjectPoolManager.GetOPMTransform(); activeList.Remove(obj); inactiveList.Add(obj); return true; } if(inactiveList.Contains(obj)){ return true; } return false; } public void MatchObjectCount(int count){ if(count>cap) return; int currentCount=GetTotalObjectCount(); for(int i=currentCount; i