private void BatchGear(BackgroundGear gear) { float randomValue = Random.value; if (randomValue <= 0.33f) { gearBatch1.Add(gear); } else if (randomValue <= 0.67f) { gearBatch2.Add(gear); } else { gearBatch3.Add(gear); } }
private void RunGearGenerationRoutine(bool isOnTheLeft) { float globalXLimit = PlatformGenerator.Instance.GlobalXLimit; int numGearsToSpawnOnPlane = config.NumGearsToSpawnOnEachSide; int numCandidates = config.GearGenerationNumCandidates; Vector3[] gearPositions = new Vector3[numGearsToSpawnOnPlane]; Vector3 cameraPosition = CameraController.Instance.Position; float startY = cameraPosition.y + config.GearGenerationYStartOffset; float endY = startY + config.GearGenerationYCap; float startZ = cameraPosition.z; float endZ = startZ + RenderSettings.fogEndDistance + config.GearGenerationEndZPadding; gearPositions[0] = new Vector3(isOnTheLeft ? -globalXLimit - config.EnvironmentHorizontalPadding : globalXLimit + config.EnvironmentHorizontalPadding, Random.Range(startY, endY), Random.Range(startZ, endZ)); for (int i = 1; i < numGearsToSpawnOnPlane; i++) { Vector3 bestCandidate = Vector3.zero; float bestDistance = 0f; for (int j = 0; j < numCandidates; j++) { Vector3 candidate = new Vector3(isOnTheLeft ? -globalXLimit - config.EnvironmentHorizontalPadding : globalXLimit + config.EnvironmentHorizontalPadding, Random.Range(startY, endY), Random.Range(startZ, endZ)); float closestDistance = 9999f; for (int k = 0; k < i; k++) { float distance = (candidate - gearPositions[k]).sqrMagnitude; if (distance < closestDistance) { closestDistance = distance; } } if (closestDistance > bestDistance) { bestCandidate = candidate; bestDistance = closestDistance; } } gearPositions[i] = bestCandidate; } for (int i = 0; i < gearPositions.Length; i++) { GameObject gear = Instantiate(GetRandomGearModel()); BackgroundGear gearComponent = gear.GetComponent <BackgroundGear>(); // Shake up the x's: gearPositions[i] = gearPositions[i] + new Vector3(Random.Range(0f, config.GearGenerationMaxXDeviation) * (isOnTheLeft ? -1f : 1f), 0f, 0f); gear.transform.position = gearPositions[i]; gear.transform.rotation = Quaternion.Euler(0f, 90f, 0f); float scale = Random.Range(config.GearGenerationMinGearScale, config.GearGenerationMaxGearScale); gear.transform.localScale = Vector3.one * scale; BatchGear(gearComponent); } }
public void OnBackgroundGearWentOutOfView(BackgroundGear backgroundGear) { backgroundGear.transform.Translate(0f, 0f, config.GearGenerationZOffscreenTranslation, Space.World); }