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的统一编辑操作。

好的,我可以为你解答。 在Unity中,Mesh用于表示3D模型的几何信息,而MeshRendererMeshFilter组件则用于将Mesh渲染到屏幕上。如果你想构建一个baseMesh脚本,可以按照以下步骤进行: 1. 创建一个空物体,并给它添加一个MeshFilter组件一个MeshRenderer组件。 2. 在脚本中,你需要定义一个Mesh实例,并使用MeshFilter组件的sharedMesh属性来获取当前物体的Mesh。 3. 接下来,你可以使用Mesh的各种方法来修改Mesh的几何信息,例如设置顶点位置、UV坐标、法线等等。 4. 修改完Mesh信息后,调用MeshFilter组件的mesh属性来更新当前物体的Mesh。 5. 最后,你可以使用MeshRenderer组件来设置物体的材质渲染模式等等。 下面是一个简单的示例代码: ```csharp using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class BaseMesh : MonoBehaviour { private Mesh baseMesh; private void Awake() { baseMesh = GetComponent<MeshFilter>().sharedMesh; } private void Start() { // 修改Mesh信息 Vector3[] vertices = new Vector3[4] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(-1, 1, 0), new Vector3(1, 1, 0) }; baseMesh.vertices = vertices; int[] triangles = new int[6] { 0, 2, 1, 2, 3, 1 }; baseMesh.triangles = triangles; // 更新Mesh GetComponent<MeshFilter>().mesh = baseMesh; // 设置材质渲染模式等等 GetComponent<MeshRenderer>().material = new Material(Shader.Find("Standard")); GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; } } ``` 希望这可以帮助你构建自己的baseMesh脚本,如果你还有其他问题,可以继续问我。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值