Beispiel #1
0
        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);
        }
Beispiel #2
0
        // 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);
        }
Beispiel #3
0
        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");
            }
        }