Unity中的Mesh Filter sharedMesh和mesh问题

Mesh Filter sharedMesh and mesh problem in Unity

网上收集的立方体生成方法如下:

static void CreateCube () {
    Vector3[] vertices = {
        new Vector3 (0, 0, 0),
        new Vector3 (1, 0, 0),
        new Vector3 (1, 1, 0),
        new Vector3 (0, 1, 0),
        new Vector3 (0, 1, 1),
        new Vector3 (1, 1, 1),
        new Vector3 (1, 0, 1),
        new Vector3 (0, 0, 1),
    };

    int[] triangles = {
        0,
        2,
        1, //face front
        0,
        3,
        2,
        2,
        3,
        4, //face top
        2,
        4,
        5,
        1,
        2,
        5, //face right
        1,
        5,
        6,
        0,
        7,
        4, //face left
        0,
        4,
        3,
        5,
        4,
        7, //face back
        5,
        7,
        6,
        0,
        6,
        7, //face bottom
        0,
        1,
        6
    };

    GameObject tem = new GameObject ("Custom Mesh");
    tem.AddComponent<MeshFilter> ();

    Mesh mesh = tem.GetComponent<MeshFilter> ().mesh;
    mesh.Clear ();
    mesh.vertices = vertices;
    mesh.triangles = triangles;
    mesh.Optimize ();
    mesh.RecalculateNormals ();
}

当我调用这个方法时,它给我错误:

Instantiating mesh due to calling MeshFilter.mesh during edit mode. This will leak meshes. Please use MeshFilter.sharedMesh instead. UnityEngine.MeshFilter:get_mesh()

最后我将 Mesh mesh = tem.GetComponent<MeshFilter>().mesh; 更改为 Mesh mesh = tem.GetComponent<MeshFilter>().sharedMesh;

它给了我另一个错误,说:

NullReferenceException: Object reference not set to an instance of an object

我点击了控制台,它让我转到了同一行。

我假设您需要在编辑器中 运行 而不是 run-time 或播放模式。

您不需要从 MeshFilter 中获取网格,因为您无论如何都会清除它并替换它的所有内容。该网格也是空的,因为您刚刚动态创建了该组件。它不包含对任何内容的引用。

就做Mesh mesh = new Mesh();。然后将其分配给您刚刚在其 sharedMesh 字段上创建的 MeshFilter。 AddComponent<>() 方法 returns 组件,因此无需再次获取它。