private void Awake() { if (ChunkRockGenerator.AssetPrefabs == null) { ChunkRockGenerator.LoadPrefabs(); } this.GameController = GameController.GetSharedInstance(); this.PlacedAssets = new List <GameObject>(); this.sampler = new PoissonDiscSampler(); }
public void Generate() { //totally random distribution as Poisson doesnt look great. var points = FakeDistribution(); for (var t = 0; t < points.Count; t++) { if (points[t] != null) { //position to place at. Vector3 pos = (Vector3)points[t]; if (ParentChunk.Terrain.terrainData.GetHeight((int)pos.x, (int)pos.z) > TerrainChunkSettings.SeaLevelGlobal) { //adjust rock specific height based on steepness to hide edges better float normalizedX = pos.x / ParentChunk.Terrain.terrainData.size.x; float normalizedY = pos.z / ParentChunk.Terrain.terrainData.size.z; float slope = ParentChunk.Terrain.terrainData.GetSteepness(normalizedX, normalizedY); float slopeOffsetHeight = (slope > 25.0f ? 3.2f : 0.5f); //choose random rock type GameObject chosenRock = ChunkRockGenerator.ChooseRandomAsset(); //set the offset for placing in the chunks world position X, Z. uses terrain height for Y Vector3 offsetPosition = new Vector3( (ParentChunk.Position.X * ParentChunk.Terrain.terrainData.size.x), ParentChunk.Terrain.terrainData.GetHeight((int)pos.x, (int)pos.z) - slopeOffsetHeight, (ParentChunk.Position.Z * ParentChunk.Terrain.terrainData.size.z) ); Vector3 spawnPosition = pos + offsetPosition; //gives rock random rotation in the y-axis Quaternion randomRotation = Quaternion.Euler(0, UnityEngine.Random.Range(0, 360), 0); float scaleModifer = UnityEngine.Random.Range(0.1f, 0.5f); Vector3 randomSize = new Vector3(scaleModifer, scaleModifer, scaleModifer); chosenRock.transform.localScale = randomSize; GameObject spawnedAsset = Instantiate(chosenRock, spawnPosition, randomRotation); //parent it under this component and track it spawnedAsset.transform.parent = this.transform; PlacedAssets.Add(spawnedAsset); RemoveOverlappingAssets(spawnedAsset); } } } }