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

  • 柏林噪音生成地形



代码很简单没有难度,自己看一下应该就能明白。


代码什么的还是可以进行二次补充像:自己进行探索一下就可以复用了。


OK 老规矩,直接上代码:

柏林噪音生成地形

uusing System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

/// <summary>
/// 柏林噪音生成地形
/// </summary>


[RequireComponent(typeof(MeshFilter))]
//RequireComponent:需要的组件将会自动被添加到game object(游戏物体),有效的避免组装错误,避免GetComponent的空引用错误。
public class MeshGerrate : MonoBehaviour
{
    private Vector3[] vertices;//记录顶点坐标信息/坐标值的矢量数组。

    private int[] triangLes;//记录顶点数值的数组。

    private Mesh mesh;

    public int xSize = 20;
    public int zSize = 20;

    void Start()
    {

        mesh = new Mesh();//创建一个空的网格。 
        GetComponent<MeshFilter>().mesh = mesh;
        //将包含mesh的信息赋值给组件
        CreatShape();
        StartCoroutine(CreatShape());
        //该方法表示:mesh网格需要需要存储哪些顶点和三角形信息
        //UpdateMesh();//加载网格

    }



    //void CreatShape()
    IEnumerator CreatShape()//观察绘制情况可以开一个携程,配合WaitForSeconds来看一步步绘制结果
    {
        int n = 0;
        vertices = new Vector3[(xSize + 1) * (zSize + 1)];
        for (int z = 0; z <= zSize; z++)
        {
            for (int i = 0; i <= xSize; i++)
            {
                float y = Mathf.PerlinNoise(i * 0.3f, z * 0.2f) * 2f;//柏林噪音
                vertices[n] = new Vector3(i, y, z);
                n++;
            }
        }



        triangLes = new int[xSize * zSize * 2 * 3];
        int ver = 0;
        int count = 0;
        for (int z = 0; z < zSize; z++)
        {
            for (int i = 0; i < xSize; i++)
            {
                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++;//直接跳过最后一行最后一个顶点,否则最后一个顶点会连线第二行第一个点,造成黑边。
        }

    }

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

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

    private void OnDrawGizmos()
    {
        //编辑器函数,自动调用。
        //绘制可被点选的gizmos,执行这个函数。这允许你在场景中快速选择重要的物体。
        if (vertices == null) return;
        for (int i = 0; i < vertices.Length; i++)
        {     
            Gizmos.DrawSphere(vertices[i], 0.1f);//使用center和radius参数,绘制一个实心球体。
        }
    }
}
组件搭载:

unity script 生成子物体_i++

最终效果:

unity script 生成子物体_i++_02

unity script 生成子物体_游戏开发_03

unity script 生成子物体_i++_04


暂时先这样吧,如果实在看不明白就留言,看到我会回复的。

路长远兮,与君共勉。