unity 程序生成mesh并实现2D山丘地形

首先看一下最终效果:


这里我假设读者已经了解并知道如何使用Mesh。如果不懂的话可以百度一下,有很多文章。

实现起来其实非常简单,思路:

每两个顶点为一组,这两个点的x坐标相同,一个在上一个在下,下边的y坐标固定为0,上边的y坐标从曲线编辑器中取值。

然后把生成的mesh赋予物体的MeshCollider。

下面给出完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshMount : MonoBehaviour {
    //每2个定点为一组,此值代表有多少组
    const int count = 50;
    //每两组顶点的间隔距离,此值越小曲线越平滑
    const float pointdis = 0.2f;

    Material mat;
    MeshCollider mc;

    //曲线
    public AnimationCurve anim;

	// Use this for initialization
	void Start () {

        mat = Resources.Load<Material>("Shader/MeshMount/Custom_meshshader");
        mc = gameObject.AddComponent<MeshCollider>();

        MeshRenderer mr = gameObject.AddComponent<MeshRenderer>();  
        mr.material = mat;  
  
        DrawSquare();
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    void DrawSquare()  
    {  
        //创建mesh
        Mesh mesh = gameObject.AddComponent<MeshFilter>().mesh;  
        mesh.Clear();

        //定义顶点列表
        List<Vector3> pointList = new List<Vector3>();
        //uv列表
        List<Vector2> uvList = new List<Vector2>();
        //第一列的前2个点直接初始化好
        pointList.Add(new Vector3(0, 0, 0));
        pointList.Add(new Vector3(0, 1, 0));

        //设置前2个点的uv
        uvList.Add(new Vector2(0, 0));
        uvList.Add(new Vector2(0,1));

        //三角形数组
        List<int> triangleList = new List<int>();

        for (int i = 0; i < count; i ++){
            //计算当前列位于什么位置
            float rate = (float)i / (float)count;
            //计算当前的顶点
            pointList.Add(new Vector3((i + 1)*pointdis, 0, 0));

            //这里从曲线函数中取出当点的高度
            pointList.Add(new Vector3((i + 1)*pointdis,anim.Evaluate(rate), 0));

            //uv直接使用rate即可
            uvList.Add(new Vector2(rate, 0));
            uvList.Add(new Vector2(rate, 1));

            //计算当前2个点与前面2个点组成的2个三角形
            int startindex = i * 2;
            triangleList.Add(startindex + 0);
            triangleList.Add(startindex + 1);
            triangleList.Add(startindex + 2);

            triangleList.Add(startindex + 3);
            triangleList.Add(startindex + 2);
            triangleList.Add(startindex + 1);
        }

        //把最终的顶点和三角形数组赋予mesh;
        mesh.vertices = pointList.ToArray();
        mesh.triangles = triangleList.ToArray();
        mesh.uv = uvList.ToArray();
        mesh.RecalculateNormals();

        //把mesh赋予MeshCollider
        mc.sharedMesh = mesh;
    }  
}




使用方法:

首先创建一个空物体,把脚本挂到此物体上,然后在Inspector面板中双击anmi,编辑出一个喜欢的曲线形状。注意横轴只有在[0,1]的范围内才有效。

接下来创建一个球体并赋予rigidbode。

最后运行场景就能看到文章最开始的效果了。



  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值