Ejemplo n.º 1
0
    /// <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);
    }
Ejemplo n.º 2
0
    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);
        }
    }
Ejemplo n.º 3
0
    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();
    }
Ejemplo n.º 4
0
    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);
    }
Ejemplo n.º 5
0
    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();
    }