IEnumerator RunOrange() { foreach (var i in Times(10)) { AnimateRect(Direction.Down, 1, Vector2.one * 0.5f, orange, CameraHelper.RandomXOffset(0.9f), level: 0); yield return(Rest(1)); } int ornamentation = 1; float boundFactor = 0.1f; foreach (var i in Times(20)) { var progress = i / 20f; // Gradually add ornamentation var offset = CameraHelper.RandomXOffset(0.6f); var scale = Vector2.one * Random.Range(0.2f, 0.5f); // the big one var speed = 1; var boundingRect = CameraHelper.BoundingRectOnPerimeter( Location.Top, CameraHelper.Width * boundFactor, CameraHelper.Height * boundFactor, offset); var foundationRect = RectHelper.RectFromCenterAndSize(boundingRect.center, scale); var formation = GenerateFormation(foundationRect, boundingRect, Random.Range(1, 3)); foreach (var rect in formation) { var lineSpeed = speed * Random.Range(1f - 0.3f * progress, 1f + 0.3f * progress); var level = 0; if (rect == formation[0]) { lineSpeed = speed; level = -1; } AnimateRect( Direction.Down, lineSpeed, rect.size, new Color[] { orange, blue, red }[Random.Range(0, Mathf.CeilToInt(3 * progress))], rect.center, 0); } yield return(Rest(2)); ornamentation++; boundFactor += 0.05f; } }