/// <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."); } }
/// <summary> /// Adds the items configured in this pool extension, as pooled items, to the main pool (Pooly) /// </summary> private void RegisterItemsToPooly() { if (registeredToPooly) { return; } if (items == null || items.Count == 0) { Debug.LogWarning("[Pooly] The '" + name + "' Pooly Extension is empty."); return; } for (int i = 0; i < items.Count; i++) { if (items[i].prefab == null) { Debug.Log("[Pooly] There is an object with no prefab referenced in " + items[i].category + " in the " + name + " pool extension."); continue; } if (Pooly.Pool.ContainsKey(items[i].prefab.name)) { Debug.Log("[Pooly] Object '" + items[i].prefab.name + "', found in the '" + name + "' pool extension, has already been added to the pool either by another Pooly Extension or by Pooly. No extra clones were created."); continue; } if (Initialized) { Pooly.Pool.Add(items[i].prefab.name, Pool[items[i].prefab.name]); #if UNITY_EDITOR if (PoolySettings.enableStatistics) { var pooledItem = Pool[items[i].prefab.name]; //pooledItem.ownStats = PoolyStatistics.ActivateStatsForPrefab(pooledItem.prefab.name, pooledItem.category, pooledItem.prefab, pooledItem.preloadCloneCount, this); pooledItem.ownStats = PoolyStatistics.GetStatisticsItem(this, pooledItem.category, pooledItem.prefab.name, pooledItem.prefab, pooledItem.preloadCloneCount); } #endif } else { Pooly.Instance.StartCoroutine(Pooly.Instance.CreateClones(items[i], PoolTransform, GetCategoryTransform(items[i]), this)); } } registeredToPooly = true; initialized = true; }
/// <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--; }