/// <summary> /// Adds the object with the indicated prefab tracker component to the pool if /// the pool can accommodate it. /// </summary> /// <param name="poolPrefabTracker">prefab tracker component of the object /// to add to the pool</param> /// <returns>true if added to pool, false if cannot be added</returns> private bool TryAddToPool(PoolPrefabTracker poolPrefabTracker) { if (poolPrefabTracker == null || poolPrefabTracker.myPrefab == null) { return(false); } if (!IsPoolable(poolPrefabTracker.myPrefab)) { return(false); } var prefab = poolPrefabTracker.myPrefab; Stack <GameObject> pooledObjects; if (!prefabToPooledObjects.TryGetValue(prefab, out pooledObjects)) { pooledObjects = new Stack <GameObject>(); prefabToPooledObjects.Add(prefab, pooledObjects); } if (pooledObjects.Count < poolConfig.GetCapacity(prefab)) { // we have capacity, add to pool pooledObjects.Push(poolPrefabTracker.gameObject); Logger.LogTraceFormat("Added {0} to pool, deactivated and moved to hiddenpos Pooled: {1}", Category.Objects, poolPrefabTracker.gameObject.GetInstanceID(), pooledObjects.Count); return(true); } return(false); }
public IEnumerator Should_Destroy_Bullet() { GameObject bullet = new GameObject(); PoolManager.Instance.PoolClientInstantiate(bullet, Vector2.zero, Quaternion.identity); BoxCollider2D collider = bullet.AddComponent <BoxCollider2D>(); PoolPrefabTracker tracker = bullet.AddComponent <PoolPrefabTracker>(); tracker.myPrefab = bullet; bullet.AddComponent <Bullet_12mm>(); try { subject.SendMessage("OnTriggerEnter2D", collider); yield return(0); Assert.That(!bullet.activeSelf); Assert.That(subject.wentBoom); } finally { Object.Destroy(bullet); } }
public override void OnStartServer() { //If this wasn't spawned via ItemFactory (i.e via map editing) then add it to //poolmanager so it can be safely destroyed PoolPrefabTracker pT = GetComponent <PoolPrefabTracker>(); if (pT == null) { StartCoroutine(WaitForServerLoad()); } base.OnStartServer(); }
public static GameObject PoolInstantiate(GameObject prefab, Vector3 position, Quaternion rotation) { if (prefab == null) { return(null); } GameObject tempObject = null; PoolPrefabTracker tracker = null; bool makeNew = false; if (pools.ContainsKey(prefab)) { if (pools[prefab].Count > 0) { //pool exists and has unused instances tempObject = pools[prefab][0]; pools[prefab].RemoveAt(0); tempObject.transform.position = position; tempObject.transform.rotation = rotation; tempObject.transform.localScale = prefab.transform.localScale; tracker = tempObject.GetComponent <PoolPrefabTracker>(); tracker.SetReleased(); tempObject.SetActive(true); return(tempObject); } else { //pool exists but is empty makeNew = true; } } else { //pool for this prefab does not yet exist pools.Add(prefab, new List <GameObject>()); makeNew = true; } if (makeNew) { tempObject = GameObject.Instantiate(prefab, position, rotation); tracker = tempObject.AddComponent <PoolPrefabTracker>(); tracker.myPrefab = prefab; tracker.SetReleased(); return(tempObject); } return(tempObject); }
static public void PoolDestroy(GameObject target, bool removeParent = false) { if (!target) { return; } if (removeParent) { target.transform.parent = null; } PoolPrefabTracker tracker = target.GetComponent <PoolPrefabTracker>(); if (tracker) { if (tracker.pooled) { return; } GameObject prefab = tracker.myPrefab; target.SetActive(false); if (!pools.ContainsKey(prefab)) { return; } pools[prefab].Add(target); } else { tracker = target.AddComponent <PoolPrefabTracker>(); tracker.myPrefab = target; if (!pools.ContainsKey(target)) { pools.Add(target, new List <GameObject>()); } PoolDestroy(target); } tracker.SetPooled(); }