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); }