public override void OnInspectorGUI() { LTerrain terrain = (LTerrain)target; base.DrawDefaultInspector(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Create")) { HeightsGenerator generator = terrain.gameObject.GetComponent <HeightsGenerator>(); if (generator == null) { Debug.Log("Heights generator object not found, just add generator as mono behaviour to object where LTerrain script is added!"); } terrain.CreateTerrain(generator);//new TestWorldheightsGenerator()); } else if (GUILayout.Button("Delete terrain")) { terrain.Delete(); } EditorGUILayout.EndHorizontal(); }
public void GenerateMeshData(int ChunkX, int ChunkY, HeightsGenerator generator) { this.ChunkX = ChunkX; this.ChunkY = ChunkY; bool create = ChunkData == null; if (ChunkData == null) { ChunkData = new ChunkMeshData(); } int ThisChunkSize = ChunkSize + 1; if (create) { ChunkData.vertices = new Vector3[ThisChunkSize * ThisChunkSize]; Heights = new float[ThisChunkSize * ThisChunkSize]; ChunkData.triangles = new int[(ThisChunkSize - 1) * (ThisChunkSize - 1) * 6]; ChunkData.colors = new Color32[ThisChunkSize * ThisChunkSize]; ChunkData.uv = new Vector2[ThisChunkSize * ThisChunkSize]; } for (int vertex_index = 0, i = 0; i <= ChunkSize; i++) { for (int j = 0; j <= ChunkSize; j++, vertex_index++) { if (create) { float h = generator.GetHeight(i + (ChunkX * (ChunkSize)), j + (ChunkY * (ChunkSize))); SetHeight(i, j, h); Color color = generator.GetColor(i + (ChunkX * (ChunkSize)), j + (ChunkY * (ChunkSize)), h); SetColor(i, j, color); ChunkData.vertices[vertex_index] = new Vector3(); ChunkData.uv[vertex_index] = new Vector2((float)i / (float)ThisChunkSize, (float)j / (float)ThisChunkSize); } float height = GetHeight(i, j); ChunkData.vertices[vertex_index].Set(i, height, j); if (i < ChunkSize && j < ChunkSize) { ChunkData.AddTriangle(vertex_index, vertex_index + ThisChunkSize + 1, vertex_index + ThisChunkSize); ChunkData.AddTriangle(vertex_index + ThisChunkSize + 1, vertex_index, vertex_index + 1); } } } ChunkData.vertex_index = 0; NeedsUpdate = true; }
public void CreateTerrain(HeightsGenerator generator) { for (int i = 0; i < ChunksCount; i++) { for (int j = 0; j < ChunksCount; j++) { TerrainChunk chunk = CreateChunkObject(i, j); TerrainChunks.Add(chunk); chunk.gameObject.transform.parent = gameObject.transform; chunk.gameObject.transform.localPosition = new Vector3(i * TerrainChunk.ChunkSize, 0, j * TerrainChunk.ChunkSize); chunk.gameObject.GetComponent <MeshRenderer>().material = Material; chunk.InitMesh(); chunk.GenerateMeshData(i, j, generator); } } }