/// <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."); } }
public virtual void ReturnItem(T item) { PooledItem <T> pooledItem = pooledItems.Find(i => i.Item.Equals(item)); pooledItem.IsUsed = false; Debug.Log("Returning to pool"); }
public void Add(T item) { var pair = new PooledItem(item); var node = new LinkedListNode <PooledItem>(pair); pool.AddLast(node); mapping[item] = node; }
/// <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); }
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); }
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); }
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()); }
/// <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()); }
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++); }
int InsertItemToPool(Item item, int rotation) { ItemPool[LastItemId] = new PooledItem(item, rotation); item.transform.SetParent(staticItemPool.transform); return(LastItemId++); }
/// <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; }