public void Release(string name, GameObject instanceObject)
 {
     if (m_ObjectMap.ContainsKey(name))
     {
         PoolObjectState          pos   = m_ObjectMap[name];
         List <PoolInstanceState> poiss = m_ObjectInstanceMap[name];
         for (int i = 0; i < poiss.Count; i++)
         {
             if (poiss[i].gameObject == instanceObject)
             {
                 poiss[i].state = PoolInstanceStateType.Sleep;
                 ObjectPoolInstance opi = instanceObject.GetComponent <ObjectPoolInstance>();
                 if (opi != null)
                 {
                     opi.OnPoolRelease();
                 }
                 instanceObject.SetActive(false);
                 instanceObject.transform.parent        = m_ObjectPool.transform;
                 instanceObject.transform.localScale    = Vector3.one;
                 instanceObject.transform.localPosition = Vector3.one;
             }
         }
     }
 }
 public GameObject Instantiate(string name)
 {
     if (m_ObjectMap.ContainsKey(name))
     {
         PoolObjectState          pos   = m_ObjectMap[name];
         List <PoolInstanceState> poiss = m_ObjectInstanceMap[name];
         int activeCount            = 0;
         int minId                  = -1;
         int maxId                  = 0;
         PoolInstanceState oldest   = null;
         PoolInstanceState sleepOne = null;
         for (int i = 0; i < poiss.Count; i++)
         {
             if (i == 0 && minId == -1)
             {
                 minId = poiss[i].stateId;
             }
             if (poiss[i].state == PoolInstanceStateType.Sleep)
             {
                 sleepOne = poiss[i];
             }
             else
             {
                 activeCount++;
                 if (poiss[i].stateId <= minId)
                 {
                     oldest = poiss[i];
                     minId  = oldest.stateId;
                 }
                 if (maxId < poiss[i].stateId)
                 {
                     maxId = poiss[i].stateId;
                 }
             }
         }
         if (sleepOne != null)
         {
             sleepOne.stateId = maxId + 1;
             sleepOne.state   = PoolInstanceStateType.Active;
             ObjectPoolInstance opi = sleepOne.gameObject.GetComponent <ObjectPoolInstance>();
             if (opi != null)
             {
                 opi.OnPoolInstantiated();
             }
             return(sleepOne.gameObject);
         }
         else
         {
             if (activeCount >= pos.max)
             {
                 sleepOne         = oldest;
                 sleepOne.stateId = maxId + 1;
                 sleepOne.state   = PoolInstanceStateType.Active;
                 ObjectPoolInstance opi = sleepOne.gameObject.GetComponent <ObjectPoolInstance>();
                 if (opi != null)
                 {
                     opi.OnPoolRelease();
                     opi.OnPoolInstantiated();
                 }
                 return(sleepOne.gameObject);
             }
             else
             {
                 GameObject goI = Instantiate <GameObject>(pos.gameObject);
                 goI.SetActive(false);
                 goI.transform.parent        = m_ObjectPool.transform;
                 goI.transform.localScale    = Vector3.one;
                 goI.transform.localPosition = Vector3.one;
                 PoolInstanceState pis = new PoolInstanceState();
                 pis.gameObject = goI;
                 pis.name       = pos.name;
                 pis.stateId    = maxId + 1;
                 pis.state      = PoolInstanceStateType.Active;
                 m_ObjectInstanceMap[name].Add(pis);
                 ObjectPoolInstance opi = goI.GetComponent <ObjectPoolInstance>();
                 if (opi != null)
                 {
                     opi.OnPoolInstantiated();
                 }
                 return(goI);
             }
         }
     }
     return(null);
 }