IEnumerator ReturnObjCoroutine(ObjectPoolNode <T> node, float time) { node.disableStartTime = Time.time; node.disableTotalTime = time; yield return(new WaitForSeconds(time)); DisablePoolObj(node.obj); }
IEnumerator ReturnObjNextFrameCoroutine(ObjectPoolNode <T> node) { node.disableStartTime = Time.time; node.disableTotalTime = 0.0f; yield return(null); DisablePoolObj(node.obj); }
protected void CreateInitialObjs(int num) { initialized = true; for (int i = 0; i < num; ++i) { var node = CreateObjectPoolNode(); nextFreeNode = node; } }
public void Reset() { // mark all nodes as free and unactive foreach (var node in activeNodes) { node.Value.next = nextFreeNode; node.Value.obj.gameObject.SetActive(false); nextFreeNode = node.Value; } activeNodes.Clear(); }
public void ObjPoolObjDestroyed(GameObject obj) { ObjectPoolNode <T> node = null; if (activeNodes.TryGetValue(obj.GetInstanceID(), out node)) { if (node.timedDisableCoroutine != null && objPoolObj != null) { objPoolObj.StopCoroutine(node.timedDisableCoroutine); node.timedDisableCoroutine = null; } activeNodes.Remove(node.obj.GetInstanceID()); } }
public void ReturnPoolObjNextFrame(GameObject obj) { if (objPoolObj == null) { return; } ObjectPoolNode <T> foundNode = null; if (activeNodes.TryGetValue(obj.GetInstanceID(), out foundNode)) { MiscUnityFunctions.StopCoroutine(objPoolObj, ref foundNode.timedDisableCoroutine); foundNode.timedDisableCoroutine = objPoolObj.StartCoroutine(ReturnObjNextFrameCoroutine(foundNode)); } }
public List <T> GetEntirePoolList() { List <T> dataList = new List <T>(activeNodes.Count); foreach (var node in activeNodes) { dataList.Add(node.Value.comp); } ObjectPoolNode <T> currNode = nextFreeNode; while (currNode != null) { dataList.Add(currNode.comp); currNode = currNode.next; } return(dataList); }
protected virtual ObjectPoolNode <T> CreateObjectPoolNode() { if (!initialized) { return(null); } // instantiate a new node and set it as the next free node GameObject objNode = GameObject.Instantiate(objPrefab) as GameObject; objNode.SetActive(false); objNode.transform.SetParent(poolGameObj.transform); objNode.transform.localPosition = new Vector3(); ObjectPoolNode <T> node = new ObjectPoolNode <T>(objNode, nextFreeNode); ObjPoolNodeDestroyedSignal destroyedComp = objNode.AddComponent <ObjPoolNodeDestroyedSignal>(); destroyedComp.Init(this); return(node); }
public void DisablePoolObj(GameObject obj) { ObjectPoolNode <T> foundNode = null; if (activeNodes.TryGetValue(obj.GetInstanceID(), out foundNode)) { foundNode.next = nextFreeNode; foundNode.obj.gameObject.SetActive(false); foundNode.obj.gameObject.transform.SetParent(poolGameObj.transform); foundNode.poolAutoDestroyEnabled = true; if (foundNode.timedDisableCoroutine != null) { foundNode.disableStartTime = foundNode.disableTotalTime = 0.0f; objPoolObj.StopCoroutine(foundNode.timedDisableCoroutine); foundNode.timedDisableCoroutine = null; } nextFreeNode = foundNode; activeNodes.Remove(foundNode.obj.GetInstanceID()); } }
public ObjectPoolNode Next(ObjectPoolNode value) { if (value == null) { return(null); } if (value.Next != null) { if (value.Next.IsActive == false) { var newInActive = value.Next; value.Next = newInActive.Next; newInActive.Next = _firstInActive; _firstInActive = newInActive; //size--; return(Next(value.Next)); } } return(value.Next); }
private ObjectPoolNode <T> GetNode() { if (nextFreeNode != null) { // if there is a free node, return it ObjectPoolNode <T> node = nextFreeNode; activeNodes.Add(node.obj.GetInstanceID(), nextFreeNode); nextFreeNode = nextFreeNode.next; node.obj.SetActive(true); return(node); } else if (canExpand) { // if there is not a free node, make one and return it ObjectPoolNode <T> newNode = CreateObjectPoolNode(); activeNodes.Add(newNode.obj.GetInstanceID(), newNode); newNode.obj.gameObject.SetActive(true); return(newNode); } return(null); }
public T GetInActive() { T t; if (_firstInActive != null) { t = _firstInActive.Item; _firstInActive = _firstInActive.Next; } else { Size++; t = new T(); } var newFirst = new ObjectPoolNode(t, true); newFirst.Next = FirstActive; FirstActive = newFirst; return(t); }
public ObjectPoolNode(GameObject obj, ObjectPoolNode <V> next) { this.obj = obj; this.next = next; comp = obj.GetComponent <V>(); }