一.在Unity中创建Mesh网格的用处包括:
-
自定义3D模型:允许开发者创建独特的3D形状,超越Unity内置几何体的限制。
-
性能优化:通过合并多个网格,减少Draw Call,提高渲染效率,特别是在处理大量相似物体时。
-
细节丰富:支持更复杂的细节表现,如细分网格、法线贴图等,增强视觉效果。
-
动态生成内容:在运行时生成地形、建筑物等,增加游戏的变化性和可玩性。
-
物理交互:与物理引擎结合,创建复杂的碰撞体,增强物体之间的物理交互效果。
-
动画和变形:实现复杂的动画效果,如角色表情变化或物体形状变换。
-
环境构建:用于创建游戏环境中的各种元素,如地形、建筑、道具等,提升游戏的沉浸感。
(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网格就被替换掉了。
这里是导出圆形网格的步骤:
这时你就可以看到你的圆形网格: