网格过滤器共享Unity中的网格和网格问题

时间:2019-06-22 11:06:13

标签: c# unity3d mesh

这是生成通过互联网收集的多维数据集的方法:

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 ();
}

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

  

由于在编辑模式下调用MeshFilter.mesh而实例化了网格。这将泄漏网格。请改用MeshFilter.sharedMesh。   UnityEngine.MeshFilter:get_mesh()

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

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

  

NullReferenceException:对象引用未设置为对象的实例

我点击了 Console ,它使我转至同一行。

1 个答案:

答案 0 :(得分:1)

我认为您需要在编辑器中运行而不是在运行时或播放模式下运行。

您无需从MeshFilter提取网格,因为无论如何都将其清除并替换其所有内容。该网格也是空的,因为您是动态创建的。它没有任何引用。

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