private void GenerateCoins() { float coinRadius = _factory.CoinRadius(); int firstNum = 0; int lastNum = 0; float deltaPlatformCoin = 0.2f; _allObjects.Sort(CompareByTransformHeight); foreach (CoinInterval coinInterval in _data.CoinIntervals) { // Find free space intervals between List <float[]> rawIntervals = new List <float[]>(); firstNum = lastNum; for (int i = firstNum; (_allObjects[i].transform.position.y < coinInterval.IntervalEnd) && (i < _allObjects.Count - 1); i++) { if (_allObjects[i + 1].transform.position.y - _allObjects[i].transform.position.y - _platformSize.y - 2 * deltaPlatformCoin > coinRadius * 2) { rawIntervals.Add(new float[] { _allObjects[i].transform.position.y + _platformSize.y / 2 + deltaPlatformCoin, _allObjects[i + 1].transform.position.y - _platformSize.y / 2 - deltaPlatformCoin }); } lastNum++; } // Find list of approximately equal space intervals between platforms List <float[]> equalIntervals = new List <float[]>(); foreach (float[] interval in rawIntervals) { double n = Math.Round((interval[1] - interval[0]) / coinRadius / 2); float delta = (interval[1] - interval[0]) / (float)n; float start = interval[0], end; for (int i = 0; i < n; ++i) { end = start + delta; equalIntervals.Add(new float[] { start, end }); start = end; } } // Generate coin in random equal space interval if (coinInterval.Number > equalIntervals.Count) { Debug.Log($"Wrong number of coins"); } int currentMaxNum = equalIntervals.Count; for (int i = 0; i < coinInterval.Number; ++i) { int num = Random.Range(0, currentMaxNum); GameObject coin = _factory.GetCoin(); Vector3 position = new Vector3( Random.Range(coinRadius, _lvlWidth - coinRadius), Random.Range(equalIntervals[num][0] + coinRadius, equalIntervals[num][1] - coinRadius)); coin.transform.position = position; currentMaxNum--; equalIntervals.RemoveAt(num); } } }