Unity中的Mesh和MeshFilter的区别
首先明确一点,Mesh是一个类,MeshRenderer和MeshFilter都可以作为组件,挂载到GameObject上面,但是Mesh不可以。
Mesh: 译作 网格,是一个数据结构,记载了组成一个GameObject的所有三角形面。
MeshFilter: 译作 网格过滤器,记载着物体对应的所有Mesh的引用,当渲染GameObject时,通过MeshFilter获取其对应的Mesh。
MeshFilter是一个从Unity老版本留存下来的叫法,实际上它并不过滤任何东西,如果换一个更准确的名字:MeshRefference 可能更好理解。
如果还没完全理解,可以看下面这个例子:
先在Unity的Hierarchy界面建立一个空的GameObject,然后在其对应的Inspector界面上添加两个组件,MeshFilter和MeshRenderer,可以看到MeshFilter下面的Mesh槽是空的,点击右边的小圆圈可以选择系统自带的Mesh,如下图所示:
然后我们再在该物体上,点击AddComponent,创建并添加MeshGenerator
脚本,脚本内容如下:
[RequireComponent(typeof(MeshFilter))]//这个脚本挂载的GameObject必须需要MeshFilter组件
public class MeshGenerator : MonoBehaviour
{
public Mesh mesh;
public Vector3[] vertices;//mesh的最基本数据,记录每一个点
public int[] triangles;//mesh的最基本数据,记录每一个组成三角形的三个点的index
void Start()
{
mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;//把mesh传给MeshFilter
CreateMeshData();//生成mesh的data信息
mesh.Clear();//清空自带的mesh信息
mesh.vertices = vertices;
mesh.triangles = triangles;
}
//自己创建一个mesh
void CreateMeshData()
{
vertices = new Vector3[]
{
new Vector3(0, 0, 0),
new Vector3(0, 0, 1),
new Vector3(1, 0, 0),
};
triangles = new int[]
{
0, 1, 2//Unity里的索引顺序是顺时针,从上往下看是0,1,2
};
}
}
最后运行游戏,就可以在Scene界面下看到一个紫色的三角形了,由于没有设定MeshRenderer中的Material,所以默认是紫色的,如下图所示:
关于SharedMesh
从Unity的官方文档中,我看到了MeshFilter不只含有Mesh,还有一个SharedMesh
SharedMesh可以理解为,Mesh类型的Prefab
如果在Asset文件里有一个Mesh文件(比如说3ds格式的),如果场景里有很多个物体,每一个物体都用到了该Mesh,对于每一个用到该mesh的物体,其上面都实例化了一个Mesh对象,如果对物体A的mesh进行改变,其他的Mesh不会改变。
但如果想同时对所有用到该对象的mesh进行改变,可以对SharedMesh进行操作,从而实现类似prefab的统一编辑操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本