首先明确一点,Mesh是一个类,MeshRenderer和MeshFilter都可以作为组件,挂载到GameObject上面,但是Mesh不可以。

Mesh: 译作 网格,是一个数据结构,记载了组成一个GameObject的所有三角形面。

MeshFilter: 译作 网格过滤器,记载着物体对应的所有Mesh的引用,当渲染GameObject时,通过MeshFilter获取其对应的Mesh。

MeshFilter是一个从Unity老版本留存下来的叫法,实际上它并不过滤任何东西,如果换一个更准确的名字:MeshRefference 可能更好理解。

如果还没完全理解,可以看下面这个例子:

先在Unity的Hierarchy界面建立一个空的GameObject,然后在其对应的Inspector界面上添加两个组件,MeshFilter和MeshRenderer,可以看到MeshFilter下面的Mesh槽是空的,点击右边的小圆圈可以选择系统自带的Mesh,如下图所示:

harmonyos 怎么实现 filter 的功能 filtermesh_顺时针


然后我们再在该物体上,点击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,所以默认是紫色的,如下图所示:

harmonyos 怎么实现 filter 的功能 filtermesh_顺时针_02

关于SharedMesh

从Unity的官方文档中,我看到了MeshFilter不只含有Mesh,还有一个SharedMesh

harmonyos 怎么实现 filter 的功能 filtermesh_数据_03

SharedMesh可以理解为,Mesh类型的Prefab
如果在Asset文件里有一个Mesh文件(比如说3ds格式的),如果场景里有很多个物体,每一个物体都用到了该Mesh,对于每一个用到该mesh的物体,其上面都实例化了一个Mesh对象,如果对物体A的mesh进行改变,其他的Mesh不会改变。
但如果想同时对所有用到该对象的mesh进行改变,可以对SharedMesh进行操作,从而实现类似prefab的统一编辑操作。