Unity 使用柏林噪声函数构造出地面

简单版柏林噪声生成地形

using UnityEngine;
using System.Collections;


[RequireComponent(typeof(MeshFilter))]
/// <summary>
/// 柏林噪音生成地形
/// </summary>
public class MeshGerrate : MonoBehaviour
{
    [Header("地面长度")]
    public int xSize = 1;
    [Header("地面宽度")]
    public int zSize = 1;

    //  记录顶点坐标信息
    private Vector3[] vertics;
    //  记录顶点数值的数组
    private int[] triangLes;
    //  网格组件
    private Mesh mesh;


    private void Start()
    {
        //  创建一个空的网格
        mesh = new Mesh();
        //  将包含mesh的信息赋给组件
        GetComponent<MeshFilter>().mesh = mesh;

        CreatShape();
        //  该方法表示:mesh网格需要储存哪些顶点和三角形信息
        //UpdateMesh();//加载网格
        StartCoroutine(CreatShape());
    }


    //  也可以创建一个方法代替协程CreatShape();
    IEnumerator CreatShape()
    {
        int n = 0;
        //  实例化顶点坐标信息
        vertics = new Vector3[(xSize + 1) * (zSize + 1)];

        for (int z = 0; z <= zSize; z++)
        {
            for (int x = 0; x <= xSize; x++)
            {
                //  使用柏林噪音函数算出顶点高度
                float y = Mathf.PerlinNoise((x * 0.3f), (z * 0.2f)) * 2f;
                //  将得到的定点高度合并成顶点信息坐标
                vertics[n] = new Vector3(x, y, z);
                //  n自增
                n++;
            }
        }
       
        //  实例化顶点数值数组【2*3地面一个平面有两个三角形一个三角形有3个顶点】
        triangLes = new int[xSize * zSize * 2 * 3];
        int ver = 0;
        int count = 0;
        for (int z = 0; z < zSize; z++)
        {
            for (int x = 0; x < xSize; x++)
            {
                //  固定公式
                triangLes[count + 0] = ver + 0;
                triangLes[count + 1] = ver + xSize + 1;
                triangLes[count + 2] = ver + 1;
                triangLes[count + 3] = ver + xSize + 1;
                triangLes[count + 4] = ver + xSize + 2;
                triangLes[count + 5] = ver + 1;
                count += 6;
                ver++;
                //  暂停一帧
                yield return new WaitForSeconds(0.1f);
            }
            ver++;//  直接跳过最后一行最后一个顶点,否则最后一个顶点会连接第二行第一个点,造成黑边
        }

    }

    private void Update()
    {
        //  加载网格
        UpdateMesh();
    }

    private void UpdateMesh()
    {
        //  清空所有顶点数据和所有三角形索引/每次绘制之前把之前的信息清理一下,避免造成干扰
        mesh.Clear();
        //  将顶点坐标系赋给网格
        mesh.vertices = vertics;
        //  将顶点数值赋给网格
        //  triangles:在网格里,一个包含所有三角形的数组
        mesh.triangles = triangLes;

        mesh.RecalculateNormals();
    }
}

创建一个空物体

        添加Mesh Filter、MeshRenderer

详细过程看Unity代码编写自定义柏林噪音生成地形(可扩展)

猜你喜欢

转载自blog.csdn.net/qq_24977805/article/details/123072000