private IEnumerator DelayedReturnGameObject(object param)
    {
        DelayedReturnObjectWrapper wrapper = (DelayedReturnObjectWrapper)param;

        yield return(new WaitForSeconds(wrapper.Seconds));

        // Only return the object if it's still active
        if (wrapper.Obj.activeInHierarchy)
        {
            // Reset the position and hide
            wrapper.Obj.SetActive(false);
            wrapper.Obj.transform.position = new Vector3(0, 0, 0);
            wrapper.Obj.transform.rotation = new Quaternion(0, 0, 0, 0);
            wrapper.Obj.transform.parent   = this.transform;

            if (wrapper.Obj.rigidbody != null)
            {
                wrapper.Obj.rigidbody.velocity = new Vector3();
            }

            if (this.pooledObjects.ContainsKey(wrapper.Name))
            {
                // Put it back into the queue
                Queue <GameObject> availableObjects = this.pooledObjects[wrapper.Name];

                lock (availableObjects)
                {
                    availableObjects.Enqueue(wrapper.Obj);
                }
            }
            else
            {
                this.ReturnObjectNotFound++;
            }
        }
    }
    public void ReturnGameObject(string name, GameObject obj, float waitForSeconds)
    {
        DelayedReturnObjectWrapper wrapper = new DelayedReturnObjectWrapper(name, obj, waitForSeconds);

        this.StartCoroutine("DelayedReturnGameObject", wrapper);
    }