void Awake() { // Create pool and loop over all prefabs. pool = new List <GameObject> [Prefabs.Length]; for (int i = 0; i < Prefabs.Length; i++) { PooledPrefab pp = Prefabs[i]; // If no poolable script found and prefab hasn't confirmed this fact: print an error. if (!pp.ConfirmedNotPoolable && pp.Prefab.GetComponent <Poolable>() == null) { Debug.LogError("Game object \"" + pp.Prefab.name + "\" isn't poolable."); } // Make sure the original object isn't active. pp.Prefab.SetActive(false); // Create a pool parent (to keep inspector clean) GameObject poolParent = new GameObject(pp.Prefab.name + " pool"); pool[i] = new List <GameObject>(); // Fill the prefab's pool with the assigned amount of instances and put in the pool parent. for (int j = 0; j < pp.PoolSize; j++) { GameObject go = Instantiate(pp.Prefab); go.transform.SetParent(poolParent.transform); go.name = pp.Prefab.name; pool[i].Add(go); } } }
private PooledPrefab CreatePrefab() { GameObject gameObject = Instantiate(_prefab, this.transform); PooledPrefab prefab = gameObject.AddComponent <PooledPrefab>(); prefab.SetParentPool(this); gameObject.SetActive(false); return(prefab); }
public static void DestroyChildPrefabs(Transform parent) { for (int i = 0; i < parent.childCount;) { PooledPrefab prefab = parent.GetChild(i).GetComponent <PooledPrefab>(); if (prefab == null || !prefab._parentPool.Destroy(prefab.gameObject)) { i++; } } }
public static void DestroyChildPrefabs(Transform parent, bool instant = true) { for (int i = 0; i < parent.childCount; i++) { PooledPrefab prefab = parent.GetChild(i).GetComponent <PooledPrefab>(); if (prefab != null) { prefab._parentPool.Destroy(prefab.gameObject, instant); } } }
private PooledPrefab CreatePrefab() { #if DEBUG if (_prefab == null) { UnityEngine.Debug.LogError("PrefabInstancePool " + GameObjectUtils.GetGameObjectPath(this.gameObject) + " is missing it's prefab!"); return(null); } #endif GameObject gameObject = Instantiate(_prefab, this.transform); PooledPrefab prefab = gameObject.AddComponent <PooledPrefab>(); prefab._parentPool = this; prefab._isFree = true; gameObject.SetActive(false); return(prefab); }
public GameObject Instantiate(Transform parent = null) { Init(); GameObject newInstance = null; for (int i = 0; i < _instances.Length; i++) { if (_instances[i]._isFree) { newInstance = _instances[i].gameObject; _instances[i]._isFree = false; break; } } if (newInstance == null) { PooledPrefab[] newItems = new PooledPrefab[Mathf.Max(1, _growAmount)]; for (int i = 0; i < newItems.Length; i++) { newItems[i] = CreatePrefab(); newItems[i]._isFree = true; } ArrayUtils.Concat(ref _instances, newItems); newInstance = newItems[0].gameObject; newItems[0]._isFree = false; } if (parent != null && parent != newInstance.transform.parent) { newInstance.transform.SetParent(parent, false); } newInstance.transform.localPosition = _prefab.transform.localPosition; newInstance.transform.localRotation = _prefab.transform.localRotation; newInstance.transform.localScale = _prefab.transform.localScale; newInstance.SetActive(true); return(newInstance); }