private void GenerateForest(float forestFreq, float forestThr, float offsetX, float offsetZ, List <Townv2> towns) { for (int i = 0; i < generator.treesPerChunk; i++) { Vector3 treePos = new Vector3(Random.Range(0, size.x), 0f, Random.Range(0, size.y)); bool forest = (Mathf.PerlinNoise((cachedPos.x + treePos.x) * generator.forestsFrequency + generator.offsetX, (cachedPos.z + treePos.z) * generator.forestsFrequency + generator.offsetZ) > generator.forestsThreashold); if (forest) { foreach (Townv2 town in towns) { if (Vector3.Distance(treePos, town.transform.position - cachedPos) < town.radius + generator.townGen.treesDistance) { forest = false; break; } } } if (forest) { treePos.y = generator.GetHeightAt(cachedPos + treePos); if (treePos.y > generator.waterLevel + generator.shoreHeight && treePos.y < generator.forestsMaxAltitude) { treePositions.Add(treePos); } } } treePositionsGenerated = true; }
private void FollowGround(TerrainGen terrain) { transform.position = new Vector3(transform.position.x, 0f, transform.position.z); Vector3[] verts = mesh.vertices; for (int i = 0; i < verts.Length; i++) { verts[i].y = terrain.GetHeightAt(transform.localToWorldMatrix.MultiplyPoint(verts[i])) + .2f; } mesh.vertices = verts; mesh.RecalculateNormals(); mesh.RecalculateBounds(); }