/// <summary> /// Unspawns a given GameObject and adds it back to the available /// resource pool. /// </summary> public void Unspawn(GameObject targetGO) { PooledBehaviour targetComponent = targetGO.GetComponent <PooledBehaviour> (); #if UNITY_EDITOR if (targetComponent == null) { Debug.LogError("Attempting to Unspawn an object not belonging to this pool!"); return; } #endif // UNITY_EDITOR // If the object has been manually assigned to this pool, // add it to our master list. if (!_allObjects.Contains(targetComponent)) { _allObjects.Add(targetComponent); } // Reset parent in case the object was moved by the user. targetComponent.CachedXform.parent = _poolParentTransform; if (!_availableObjects.Contains(targetComponent)) { targetComponent.OnUnspawn(); targetGO.SetActive(false); _availableObjects.Push(targetComponent); } }
protected override void Awake() { base.Awake(); // Create a parent for grouping all objects together. { StringBuilder stringBuilder = new StringBuilder("UzuPool - "); stringBuilder.Append(_prefab.name); GameObject poolParent = new GameObject(stringBuilder.ToString()); _poolParentTransform = poolParent.transform; _poolParentTransform.parent = CachedXform; _poolParentTransform.localPosition = Vector3.zero; _poolParentTransform.localScale = Vector3.one; _poolParentTransform.localRotation = Quaternion.identity; } _prefabTransform = _prefab.transform; _availableObjects = new Stack <PooledBehaviour> (_initialCount); _allObjects = new List <PooledBehaviour> (_initialCount); // Pre-allocate our pool. { // Allocate objects. for (int i = 0; i < _initialCount; ++i) { CreateObject(Vector3.zero, Quaternion.identity); } // Add to pool. for (int i = 0; i < _allObjects.Count; i++) { GameObject targetGO = _allObjects [i].gameObject; targetGO.SetActive(false); PooledBehaviour targetComponent = targetGO.GetComponent <PooledBehaviour> (); _availableObjects.Push(targetComponent); } } }
private GameObject CreateObject(Vector3 position, Quaternion rotation) { GameObject resultGO = GameObject.Instantiate(_prefab, position, rotation) as GameObject; PooledBehaviour resultComponent = resultGO.GetComponent <PooledBehaviour> (); if (resultComponent == null) { Debug.LogError("Pooled object must contain a Uzu.PooledBehaviour component."); GameObject.Destroy(resultGO); return(null); } Transform resultTransform = resultComponent.CachedXform; resultTransform.parent = _poolParentTransform; resultTransform.localPosition = position; resultTransform.localRotation = rotation; resultTransform.localScale = _prefabTransform.localScale; _allObjects.Add(resultComponent); resultComponent.AddToPool(this); return(resultGO); }