简单版柏林噪声生成地形
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