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());
        }
    }
Example #10
0
 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);
 }
Example #12
0
        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>();
 }