PoolObjectData AddNewPoolItem() { GameObject new_obj = MonoBehaviour.Instantiate(m_prefab_reference) as GameObject; Transform obj_transform = new_obj.transform; T obj_t_ref = new_obj.GetComponent <T>(); PoolObjectData object_data = new PoolObjectData() { m_gameObject = new_obj, m_transform = obj_transform, m_type_obj = obj_t_ref }; // Add hash code reference to lookup dictionary for later backwards lookup m_obj_hash_lookup.Add(obj_t_ref.GetHashCode().ToString(), object_data); // Add object data instance to pool list m_pool.Add(object_data); obj_transform.SetParent(m_pool_container); new_obj.SetActive(false); new_obj.name = m_pool_name + " #" + m_total_pool_size; m_total_pool_size++; if (m_object_creation_callback != null) { m_object_creation_callback(obj_t_ref); } return(object_data); }
// Gets an available object. Either from the object pool, or by instantiating a new one. public T GetObject(bool activateObject = true) { T obj = null; if (m_pool.Count > 0) { // Activate next object PoolObjectData object_data = m_pool[0]; object_data.m_gameObject.SetActive(activateObject); obj = object_data.m_type_obj; m_pool.RemoveAt(0); m_in_use_pool.Add(object_data); } else { // Add a new object PoolObjectData object_data = AddNewPoolItem(); m_pool.RemoveAt(0); m_in_use_pool.Add(object_data); // Activate new object instance object_data.m_gameObject.SetActive(activateObject); obj = object_data.m_type_obj; } return(obj); }
public void Recycle(T obj) { int hash_code = obj.GetHashCode(); if (m_obj_hash_lookup.ContainsKey(hash_code.ToString())) { PoolObjectData object_data = m_obj_hash_lookup[hash_code.ToString()]; if (m_in_use_pool.Contains(object_data)) { object_data.m_transform.SetParent(m_pool_container); // Check to see if a recycle action override has been defined or not. if (m_object_recycle_steps_override != null) { m_object_recycle_steps_override(object_data.m_type_obj); } else { object_data.m_gameObject.SetActive(false); } m_in_use_pool.Remove(object_data); m_pool.Add(object_data); } //else object is already in the pool of inactive objects and doesn't need recycling } else { Debug.LogWarning("You're trying to \"recycle\" a pool object, which isn't already part of this pool"); } }