Example #1
0
        /// <summary>
        /// Creates a missing PooledItem and adds it to the pool.
        /// </summary>
        private static void CreateMissingPooledItem(Transform prefab, string itemName, bool spawn)
        {
            var clones = new List <Transform>();

            if (spawn)
            {
                clones.Add(CreateClone(prefab, clones.Count + 1, Instance.GetCategoryTransform(DEFAULT_CATEGORY_NAME)));
            }
            var pooledItem = new PooledItem(clones)
            {
                prefab            = prefab,
                poolTransform     = PoolTransform,
                categoryTransform = Instance.GetCategoryTransform(DEFAULT_CATEGORY_NAME)
            };

            Instance.items.Add(new Item()
            {
                prefab = prefab
            });
            Pool.Add(itemName, pooledItem);
#if UNITY_EDITOR
            if (PoolySettings.enableStatistics)
            {
                //pooledItem.ownStats = PoolyStatistics.ActivateStatsForPrefab(itemName, DEFAULT_CATEGORY_NAME, prefab, 0, null);
                pooledItem.ownStats = PoolyStatistics.GetStatisticsItem(null, DEFAULT_CATEGORY_NAME, itemName, prefab, 0);
            }
#endif
            if (Instance.debug)
            {
                Debug.Log("[Pooly] Object " + itemName + " was added to the pool.");
            }
        }
Example #2
0
    public virtual void ReturnItem(T item)
    {
        PooledItem <T> pooledItem = pooledItems.Find(i => i.Item.Equals(item));

        pooledItem.IsUsed = false;
        Debug.Log("Returning to pool");
    }
Example #3
0
        public void Add(T item)
        {
            var pair = new PooledItem(item);
            var node = new LinkedListNode <PooledItem>(pair);

            pool.AddLast(node);
            mapping[item] = node;
        }
Example #4
0
 /// <summary>
 /// Returns the number of clones (active and disabled) for the given pooled item
 /// </summary>
 private static int GetCloneCount(PooledItem pooledItem, PoolyExtension poolyExtension = null)
 {
     if (!Initialized)
     {
         Debug.LogWarning("[Pooly] Not has not finished it's initialization yet.");
     }
     return(Initialized ? pooledItem.CloneCount : -1);
 }
    public T CreateNewPoolItem()
    {
        PooledItem <T> NewPoolItem = new PooledItem <T>();

        NewPoolItem.poolItem = CreateItem();
        NewPoolItem.isUsed   = true;
        poolItemList.Add(NewPoolItem);
        return(NewPoolItem.poolItem);
    }
Example #6
0
    private T CreateNewPooledItem()
    {
        PooledItem <T> pooledItem = new PooledItem <T>();

        pooledItem.Item   = CreateItem();
        pooledItem.IsUsed = true;
        pooledItems.Add(pooledItem);
        Debug.Log("New item added to pool: " + pooledItems.Count);
        return(pooledItem.Item);
    }
Example #7
0
        public TValue Get(TKey key)
        {
            var pooledItem = new PooledItem();

            if (pooledItems.TryGetValue(key, out var linkedList) && linkedList.Count > 0)
            {
                pooledItem = linkedList.First.Value;
                linkedList.RemoveFirst();
            }
            return(pooledItem.Item);
        }
Example #8
0
    public virtual T GetItem()
    {
        if (pooledItems.Count > 0)
        {
            PooledItem <T> item = pooledItems.Find(i => i.IsUsed == false);
            if (item != null)
            {
                item.IsUsed = true;
                return(item.Item);
            }
        }

        return(CreateNewPooledItem());
    }
Example #9
0
        /// <summary>
        /// Despawn the given clone.
        /// </summary>
        public static void Despawn(Transform clone)
        {
            if (!Initialized)
            {
                Debug.LogWarning("[Pooly] Not has not finished its initialization yet."); return;
            }
            if (clone == null)
            {
                Debug.LogWarning("[Pooly] Cannot despawn a null prefab."); return;
            }
            if (Instance == null)
            {
                return;
            }           // Scene change in progress
            string itemName        = GetPrefabNameFromClone(clone);
            bool   autoCreatedItem = false;

            if (!Pool.TryGetValue(itemName, out auxDespawnPooledItem))
            {
                if (Instance.autoAddMissingItems)
                {
                    CreateMissingPooledItem(clone, itemName, false);
                    auxDespawnPooledItem = Pool[itemName];
                    autoCreatedItem      = true;
                }
                else
                {
                    Debug.Log("[Pooly] The object '" + itemName + "', you are trying to Despawn, does not exist in the pool."); return;
                }
            }
            if (auxDespawnPooledItem.ActiveClones.Remove(clone) || autoCreatedItem)
            {
                if (clone.parent != auxDespawnPooledItem.categoryTransform)
                {
                    SetParent(clone, auxDespawnPooledItem.categoryTransform);
                }
                TriggerOnDespawned(clone);
                SetActive(clone, false);
                auxDespawnPooledItem.DisabledClones.Add(clone);
                if (Instance.debug || auxDespawnPooledItem.debug)
                {
                    MyLog.Blue("对象池中:回收了 ->" + itemName);
                }
            }
            else
            {
                Debug.Log("[Pooly] Tried to despawn a clone of '" + itemName + "', but it was already despawned!");
            }
        }
 public T GetPooledItem()
 {
     if (poolItemList.Count > 0)
     {
         PooledItem <T> poolObject = poolItemList.Find(i => i.isUsed == false);
         if (poolObject != null)
         {
             poolObject.isUsed = true;
             return(poolObject.poolItem);
         }
         else
         {
             return(CreateNewPoolItem());
         }
     }
     return(CreateNewPoolItem());
 }
Example #11
0
    public static int AddItemToPool(Item item, Vector2 position, int rotation)
    {
        item.GetComponent <Collider>().enabled = true;
        item.SetUniqueID(LastItemId);
        item.SetLevel(1);
        item.SetPosition(position);
        item.SetHP(item.GetMaxHP());
        item.transform.SetParent(staticItemPool.transform);

        ItemPool[LastItemId] = new PooledItem(item, rotation);

        Managers.Factory.CheckOnFactory(item);
        TowerManager.CheckOnTower(item);

        SaveItemToDatabase(item.GetID());
        PayForItem(item.GetID());
        return(LastItemId++);
    }
Example #12
0
 int InsertItemToPool(Item item, int rotation)
 {
     ItemPool[LastItemId] = new PooledItem(item, rotation);
     item.transform.SetParent(staticItemPool.transform);
     return(LastItemId++);
 }
Example #13
0
        /// <summary>
        /// Created a pooled item for the given item and all the clones that need to be preloaded, in the specified pattern.
        /// </summary>
        public IEnumerator CreateClones(Item item, Transform poolTransform, Transform categoryTransform, PoolyExtension poolyExtension)
        {
            runningCoroutines++;
            var pooledItem = new PooledItem(new List <Transform>())
            {
                category                     = item.category,
                prefab                       = item.prefab,
                preloadCloneCount            = item.preloadCloneCount,
                limitCloneCount              = item.limitCloneCount,
                cloneCountLimit              = item.cloneCountLimit,
                limitCloneCreationPerFrame   = item.limitCloneCreationPerFrame,
                clonesOnFirstFrame           = item.clonesOnFirstFrame,
                clonesPerFrame               = item.clonesPerFrame,
                delayCreatingClonesForFrames = item.delayCreatingClonesForFrames,
                allowInstantiateMore         = item.allowInstantiateMore,
                allowRecycleClones           = item.allowRecycleClones,
                debug             = item.debug,
                poolTransform     = poolTransform,
                categoryTransform = categoryTransform
            };

            Pooly.Pool.Add(item.prefab.name, pooledItem);
#if UNITY_EDITOR
            if (PoolySettings.enableStatistics)
            {
                //pooledItem.ownStats = PoolyStatistics.ActivateStatsForPrefab(item.prefab.name, item.category, item.prefab, item.preloadCloneCount, poolyExtension);
                pooledItem.ownStats = PoolyStatistics.GetStatisticsItem(poolyExtension, item.category, item.prefab.name, item.prefab, item.preloadCloneCount);
            }
#endif
            int cloneNumber = 1;
            auxCloneTransform = null;
            if (item.limitCloneCreationPerFrame)
            {
                if (item.clonesOnFirstFrame > 0)
                {
                    while (cloneNumber <= item.preloadCloneCount && cloneNumber <= item.clonesOnFirstFrame)
                    {
                        auxCloneTransform = CreateClone(item.prefab, cloneNumber, categoryTransform);
                        Pooly.Pool[item.prefab.name].DisabledClones.Add(auxCloneTransform);
                        cloneNumber++;
                    }
                }

                if (item.delayCreatingClonesForFrames > 0)
                {
                    int delayedFrames = 0;
                    while (delayedFrames <= item.delayCreatingClonesForFrames)
                    {
                        yield return(null); delayedFrames++;
                    }
                }
                while (cloneNumber <= item.preloadCloneCount)
                {
                    auxCloneTransform = CreateClone(item.prefab, cloneNumber, categoryTransform);
                    Pooly.Pool[item.prefab.name].DisabledClones.Add(auxCloneTransform);
                    if (cloneNumber % item.clonesPerFrame == 0)
                    {
                        yield return(null);
                    }
                    cloneNumber++;
                }
            }
            else
            {
                while (cloneNumber <= item.preloadCloneCount)
                {
                    auxCloneTransform = CreateClone(item.prefab, cloneNumber, categoryTransform);
                    Pooly.Pool[item.prefab.name].DisabledClones.Add(auxCloneTransform);
                    cloneNumber++;
                }
            }
            if (poolyExtension != null)
            {
                poolyExtension.Pool.Add(item.prefab.name, pooledItem);
            }
            runningCoroutines--;
        }
    public void ReturnItemToPool(T item)
    {
        PooledItem <T> returnPoolObject = poolItemList.Find(i => i.poolItem.Equals(item));

        returnPoolObject.isUsed = false;
    }