private void CircleGenerated(Map map, float hxSize, float hzSize, float minRadius, float maxRadius, int indexOffset, float objPerSquareMeter, MapObject[] prefabs, int count) { for (int iCircle = 0; iCircle < count; iCircle++) { var forestRadius = Random.Range(minRadius, maxRadius); var centerX = Random.Range(-hxSize, hxSize); var centerZ = Random.Range(-hzSize, hzSize); var objCount = Mathf.PI * forestRadius * forestRadius * objPerSquareMeter; for (int iObj = 0; iObj < objCount; iObj++) { var angle = Random.Range(0, 2f * Mathf.PI); var r = Random.Range(0, 2f * forestRadius); var x = centerX + Mathf.Cos(angle) * r; var z = centerZ + Mathf.Sin(angle) * r; x = Mathf.Min(hxSize, Mathf.Max(-hxSize, x)); z = Mathf.Min(hzSize, Mathf.Max(-hzSize, z)); var pos = new Vector3(x, 0, z); var prefabIndex = Random.Range(0, prefabs.Length); var element = new Map.Element() { Position = pos, PrefabIndex = prefabIndex + indexOffset, Radius = prefabs[prefabIndex].Radius, YAngle = Random.Range(0f, 360f) }; map.TryAddElement(element); } } }
public override void Generate(Map map) { var hxSize = map.Config.SizeX * 0.5f; var hzSize = map.Config.SizeZ * 0.5f; CircleGenerated(map, hxSize, hzSize, minRadius: ForestMinRadius, maxRadius: ForestMaxRadius, indexOffset: 0, objPerSquareMeter: TreesPerSquareMeter, prefabs: Trees, count: ForestCount); CircleGenerated(map, hxSize, hzSize, minRadius: StownsMinRadius, maxRadius: StownsMaxRadius, indexOffset: Trees.Length + MeadowObjects.Length + TownObjects.Length, objPerSquareMeter: StownsPerSquareMeter, prefabs: Stowns, count: StownsCount); CircleGenerated(map, hxSize, hzSize, minRadius: TownMinRadius, maxRadius: TownMaxRadius, indexOffset: Trees.Length + MeadowObjects.Length, objPerSquareMeter: TownObjectsPerSquareMeter, prefabs: TownObjects, count: TownCount); var meadowObjectCount = map.Config.SizeX * map.Config.SizeZ * MeadowObjectInSquareMeter; for (int iMeadowObject = 0; iMeadowObject < meadowObjectCount; iMeadowObject++) { var x = Random.Range(-hxSize, hxSize); var z = Random.Range(-hzSize, hzSize); var pos = new Vector3(x, 0, z); var prefabIndex = Random.Range(0, MeadowObjects.Length); var element = new Map.Element() { Position = pos, PrefabIndex = Trees.Length + prefabIndex, Radius = MeadowObjects[prefabIndex].Radius, YAngle = Random.Range(0f, 360f) }; if (map.TryAddElement(element)) { //Debug.Log($"Добавлен куст {MeadowObjects[prefabIndex].name}"); } } }