private void Recycle(ParticlePropertyManager ppm)
 {
     //disable object and return to pool
     ppm.rend.gameObject.SetActive(false);
     ppm.rend.transform.parent = holder;
     active.Remove(ppm);
     pool.Enqueue(ppm);
 }
 private void Update()
 {
     for (int i = 0; i < active.Count; i++)
     {
         ParticlePropertyManager ppm = active[i];
         if (ppm.done)
         {
             Recycle(ppm);
             i--;
         }
         else
         {
             ppm.Update();
         }
     }
 }
    public void GenerateParticle(
        Sprite spr, Vector3 position, Transform parent = null, bool fadeOut = true,
        float lifeTime           = 1f, float speed    = 0f, bool slowDown      = false, float rotationDeg = 0f,
        float rotationSpeed      = 0f, float size     = 1f, bool rotationDecay = false, float alpha       = 1f,
        Color?tint               = null, float fadeIn = 0f, int sortingLayer   = 0, int sortingOrder      = 0,
        float growthOverLifetime = 1f)
    {
        ParticlePropertyManager ppm = null;

        do
        {
            if (pool.Count == 0)
            {
                SetUpPoolReserve();
            }
            ppm = pool.Dequeue();
        } while (ppm.rend == null);

        SpriteRenderer rend = ppm.rend;

        rend.sprite         = spr;
        rend.sortingLayerID = sortingLayer;
        rend.sortingOrder   = sortingOrder;
        Color tintFix = tint == null ? Color.white : (Color)tint;

        rend.color = tintFix;
        GameObject obj = rend.gameObject;

        obj.SetActive(true);
        obj.transform.position    = position;
        obj.transform.eulerAngles = Vector3.forward * rotationDeg;
        obj.transform.localScale  = Vector2.one * size;
        obj.transform.parent      = parent == null ? holder : parent;
        ppm.Set(lifeTime, fadeOut, speed, slowDown, rotationSpeed, rotationDecay, alpha,
                tintFix, fadeIn, growthOverLifetime);
        active.Add(ppm);
    }