void Init()
    {
        waterObjects   = new List <Transform>();
        prevY          = cacheTransform.position.y;
        prevX          = cacheTransform.position.x;
        colliderAmount = Mathf.RoundToInt(width) * resolution;
        pointAmount    = colliderAmount + 1;
        posX           = new float[pointAmount];
        posY           = new float[pointAmount];
        velY           = new float[pointAmount];
        accY           = new float[pointAmount];
        points         = new Vector2[pointAmount * 2];
        waveColliders  = new GameObject[colliderAmount];
        for (int i = 0; i < pointAmount; i++)
        {
            posY[i] = cacheTransform.position.y;
            posX[i] = cacheTransform.position.x + width * i / colliderAmount;
            accY[i] = 0;
            velY[i] = 0;
            if (i < colliderAmount)
            {
                waveColliders[i]                      = new GameObject();
                waveColliders[i].name                 = "ZippyWater2DCollider";
                waveColliders[i].transform.parent     = transform;
                waveColliders[i].transform.position   = new Vector2(cacheTransform.position.x + width * (i + 0.5f) / colliderAmount, cacheTransform.position.y + colliderHeightOffset - (height + colliderHeightOffset) * .5f);
                waveColliders[i].transform.localScale = new Vector2(width / colliderAmount * .9f, height + colliderHeightOffset);
                ZippyWater2DCollider col = waveColliders[i].AddComponent <ZippyWater2DCollider>();
                col.index = i;
                BoxCollider2D bx = waveColliders[i].AddComponent <BoxCollider2D>();
                col.height   = bx.bounds.size.y;
                bx.isTrigger = true;
            }
        }
        BoxCollider2D bigc = GetComponent <BoxCollider2D>();

        bigc.offset = new Vector2(width * 0.5f, colliderHeightOffset - (height + colliderHeightOffset) * .5f);
        bigc.size   = new Vector2(width, height + colliderHeightOffset);
        SetBubbleParticles();
        if (waterMesh == null)
        {
            waterMesh = new Mesh();
        }
        GenerateMesh();
        TileMaterial();
        if (waterColliders == null)
        {
            waterColliders = new ZippyWater2DCollider[waveColliders.Length];
            for (int i = 0; i < waterColliders.Length; i++)
            {
                waterColliders[i] = waveColliders[i].GetComponent <ZippyWater2DCollider>();
            }
        }
    }
 void UpdateWaveColliderPositions()
 {
     if (!updateWaveColliders)
     {
         Invoke("UpdateWaveColliderPositions", updateWaveCollidersDelay);
         return;
     }
     for (int i = 0; i < waveColliders.Length; i++)
     {
         ZippyWater2DCollider c = waveColliders[i].GetComponent <ZippyWater2DCollider>();
         c.cacheTransform.position = new Vector2(c.cacheTransform.position.x, cacheTransform.position.y + colliderHeightOffset + posY[i] - c.height * .75f);
     }
     Invoke("UpdateWaveColliderPositions", updateWaveCollidersDelay);
 }