/// <summary>
        /// Provide an available object. If no objects are present in the pool, a new object is created and returned.
        /// </summary>
        /// <param name="isForceCreate">always create new object</param>
        public GameObject Use(string path, bool isForceCreate = false)
        {
            if (mDictPooler.ContainsKey(path))
            {
                if (isForceCreate)
                {
                    return(mDictPooler[path].Create());
                }

                return(mDictPooler[path].Use());
            }

            GameObject root = MyUtilities.FindObjectInFirstLayer(gameObject, path);

            if (root == null)
            {
                root = new GameObject(path);
                root.transform.SetParent(transform, false);
            }

            GameObject rootFree = MyUtilities.FindObjectInFirstLayer(root, "Free");

            if (rootFree == null)
            {
                rootFree = new GameObject("Free");
                rootFree.transform.SetParent(root.transform, false);
            }

            GameObject rootOccupied = MyUtilities.FindObjectInFirstLayer(root, "Occupied");

            if (rootOccupied == null)
            {
                rootOccupied = new GameObject("Occupied");
                rootOccupied.transform.SetParent(root.transform, false);
            }

            mDictPooler.Add(path, new MyPool(path, rootFree, rootOccupied));

            return(Use(path, isForceCreate));
        }
        /// <summary>
        /// Provide an available object. If no objects are present in the pool, a new object is created and returned.
        /// </summary>
        public GameObject Use(GameObject prefab)
        {
            if (mDictPooler.ContainsKey(prefab.name))
            {
                mDictPooler[prefab.name].SetTemplate(prefab);
                return(mDictPooler[prefab.name].Use());
            }

            GameObject root = MyUtilities.FindObjectInFirstLayer(gameObject, prefab.name);

            if (root == null)
            {
                root = new GameObject(prefab.name);
                root.transform.SetParent(transform, false);
            }

            GameObject rootFree = MyUtilities.FindObjectInFirstLayer(root, "Free");

            if (rootFree == null)
            {
                rootFree = new GameObject("Free");
                rootFree.transform.SetParent(root.transform, false);
            }

            GameObject rootOccupied = MyUtilities.FindObjectInFirstLayer(root, "Occupied");

            if (rootOccupied == null)
            {
                rootOccupied = new GameObject("Occupied");
                rootOccupied.transform.SetParent(root.transform, false);
            }

            mDictPooler.Add(prefab.name, new MyPool(prefab.name, rootFree, rootOccupied));

            mDictPooler[prefab.name].SetTemplate(prefab);
            return(Use(prefab.name, false));
        }