Unity-创建Mesh网格和导出Mesh网格

一.在Unity中创建Mesh网格的用处包括:

  1. 自定义3D模型:允许开发者创建独特的3D形状,超越Unity内置几何体的限制。

  2. 性能优化:通过合并多个网格,减少Draw Call,提高渲染效率,特别是在处理大量相似物体时。

  3. 细节丰富:支持更复杂的细节表现,如细分网格、法线贴图等,增强视觉效果。

  4. 动态生成内容:在运行时生成地形、建筑物等,增加游戏的变化性和可玩性。

  5. 物理交互:与物理引擎结合,创建复杂的碰撞体,增强物体之间的物理交互效果。

  6. 动画和变形:实现复杂的动画效果,如角色表情变化或物体形状变换。

  7. 环境构建:用于创建游戏环境中的各种元素,如地形、建筑、道具等,提升游戏的沉浸感。

(1)生成CubeMesh

Cube思路图:

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



public class CubeMesh : MonoBehaviour
{
    public MeshFilter meshFilter;
    
    // Start is called before the first frame update
    void Start()
    {
        //顶点助手 能够帮助咱们快速构建mesh网格
        VertexHelper vh = new VertexHelper();

        //Cube
        //添加顶点
        vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0, 0));
        vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(1, 1));
        vh.AddVert(new Vector3(1, 0, 0), Color.white, new Vector2(1, 0));

        vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(0, 0));
        vh.AddVert(new Vector3(1, 0, 1), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(1, 0));

        vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(1, 1));
        vh.AddVert(new Vector3(1, 0, 0), Color.white, new Vector2(1, 0));
        vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0, 1));

        vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(1, 1));
        vh.AddVert(new Vector3(1, 0, 1), Color.white, new Vector2(1, 0));
        vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(0, 0));

        vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(1, 1));
        vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(1, 1));
        vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));

        vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(0, 0));
        vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0, 1));
        vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0, 0));

        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(0, 2, 3);

        vh.AddTriangle(3, 2, 4);
        vh.AddTriangle(3, 4, 5);

        vh.AddTriangle(5, 4, 6);
        vh.AddTriangle(5, 6, 7);

        vh.AddTriangle(7, 6, 1);
        vh.AddTriangle(7, 1, 0);

        vh.AddTriangle(1, 6, 2);
        vh.AddTriangle(2, 6, 4);

        vh.AddTriangle(3, 5, 7);
        vh.AddTriangle(7, 0, 3);

        //导出mesh网格
        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);
        //自动计算法线
        mesh.RecalculateNormals();
        meshFilter.mesh = mesh;
    }

    // Update is called once per frame
    void Update()
    {

    }
}

(2)生成SphereMesh并且导出Mesh网格

Sphere思路图:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;//unity编辑器命名空间 不支持打包

public class SphereMesh
{
    [MenuItem("编辑器/导出网格")]
    public static void Init()
    {
        //顶点助手 能够帮助咱们快速构建mesh网格
        VertexHelper vh = new VertexHelper();
        //MeshFilter meshFilter;
        //画圆
        float num = 20;
        float rMax = 2;  //最大半径 1=1米
        float rMin = 1;//最小半径
        //圆 
        //添加顶点
        //每一份的弧度
        float ang = 2 * Mathf.PI / num;
        for (int i = 0; i <= num; i++)
        {
            float uvx = (float)i / num;

            float xMax = Mathf.Sin(ang * i) * rMax;
            float yMax = Mathf.Cos(ang * i) * rMax;
            vh.AddVert(new Vector3(xMax, yMax, 0), Color.white, new Vector2(uvx, 1));

            float xMin = Mathf.Sin(ang * i) * rMin;
            float yMin = Mathf.Cos(ang * i) * rMin;
            vh.AddVert(new Vector3(xMin, yMin, 0), Color.white, new Vector2(uvx, 0));
        }

        //绘制圆
        for (int i = 0; i < num; i++)
        {
            vh.AddTriangle(i * 2 + 1, i * 2, (i + 1) * 2);
            vh.AddTriangle(i * 2 + 1, (i + 1) * 2, (i + 1) * 2 + 1);

            vh.AddTriangle(i * 2 + 1, (i + 1) * 2, i * 2);
            vh.AddTriangle(i * 2 + 1, (i + 1) * 2 + 1, (i + 1) * 2);
        }

        //导出mesh网格
        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);
        //自动计算法线
        mesh.RecalculateNormals();
        //导出网格
        AssetDatabase.CreateAsset(mesh, "Assets/round.asset");

        //刷新编辑器
        AssetDatabase.Refresh();
    }
}

注意:using UnityEditor;为Unity编辑器的命名空间,不支持打包!

原始搭建图:

运行效果图:

这里原本我们选择的Sphere网格就被替换掉了。

这里是导出圆形网格的步骤:

这时你就可以看到你的圆形网格:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值