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;
    }
예제 #3
0
    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);
            }
        }
    }