Unity不会渲染网格的某些部分以尝试使其他部分可见

时间:2016-05-01 17:37:10

标签: unity3d mesh unity5 renderer

我在代码中创建了一个自定义mesh(但这似乎发生在我制作的任何GameObject,当我在游戏或编辑器中查看它时它会使一些面孔消失,这样我就可以更清楚地看到它。我可以理解这将如何有用,但它不仅对游戏玩法而且只是在项目上工作时很烦人。可能只有一个盒子我必须取消选中,但我不知道那是什么。我已经包含了一些截图(第一个是在游戏中,第二个是在编辑器中。网格应该是一个完整的金字塔形状)。我的立方体网格有12个三角形,8个顶点,没有uvs,因为默认网格有24个顶点,12个三角形,uv和uv2,仅供参考。

Screenshot in game In editor

以下是我的相机设置: Camera Settings

[编辑] 不!我错了!它与默认的cube和其他默认对象

完美配合

这是: Regular cube

但是我的立方体: Nope

以下是我使用的代码:

        if (GameObject.Find ("Hopefully a Cube") == null) {

            GameObject cube = new GameObject ("Hopefully a Cube");
            Mesh mesh = new Mesh ();

            Vector3[] verticies = new Vector3[8];
            verticies [0] = new Vector3 (0, 0, 0);
            verticies [1] = new Vector3 (100, 0, 0);
            verticies [2] = new Vector3 (0, 100, 0);
            verticies [3] = new Vector3 (100, 100, 0);

            verticies [4] = new Vector3 (0, 0, 100);
            verticies [5] = new Vector3 (100, 0, 100);
            verticies [6] = new Vector3 (0, 100, 100);
            verticies [7] = new Vector3 (100, 100, 100);

            mesh.vertices = verticies;

            int[] tris = new int[36];
            tris = new[] { 0, 2, 1, 2, 3, 1, 4, 2, 0, 6, 2, 4, 4, 6, 5, 6, 7, 5, 1, 3, 5, 3, 7, 5, 0, 4, 1, 4, 5, 1, 2, 6, 3, 6, 7, 3 };
            mesh.triangles = tris;

            mesh.RecalculateNormals ();

            MeshFilter meshFilter = cube.AddComponent<MeshFilter> ();
            meshFilter.mesh = mesh;

            MeshRenderer meshRenderer = cube.AddComponent<MeshRenderer> ();
            Texture2D texture = new Texture2D (1, 1);
            texture.SetPixels (new[] { Color.blue });
            meshRenderer.sharedMaterial = new Material (meshShader);
            meshRenderer.sharedMaterial.mainTexture = texture;

            cube.SetActive (true);

        }

        if (GameObject.Find ("Hopefully a Pyramid") == null) {

            GameObject pyramid = new GameObject ("Hopefully a Pyramid");
            Mesh mesh = new Mesh ();

            Vector3[] verticies = new Vector3[5];
            verticies [0] = new Vector3 (0, 0, 0);
            verticies [1] = new Vector3 (100, 0, 0);
            verticies [2] = new Vector3 (0, 0, 100);
            verticies [3] = new Vector3 (100, 0, 100);
            verticies [4] = new Vector3 (50, 100, 50);

            mesh.vertices = verticies;

            int[] tris = new int[18];
            tris = new[] { 0, 2, 1, 2, 3, 1, 0, 4, 1, 2, 4, 0, 3, 4, 2, 3, 4, 1 };

            mesh.triangles = tris;

            mesh.RecalculateNormals ();

            MeshFilter meshFilter = pyramid.AddComponent<MeshFilter> ();
            meshFilter.mesh = mesh;

            MeshRenderer meshRenderer = pyramid.AddComponent<MeshRenderer> ();
            Texture2D texture = new Texture2D (1, 1);
            texture.SetPixels (new[] { Color.blue });
            meshRenderer.sharedMaterial = new Material (meshShader);
            meshRenderer.sharedMaterial.mainTexture = texture;

            pyramid.SetActive (true);

        }

1 个答案:

答案 0 :(得分:4)

网格的索引(三角形数组中的整数)顺序错误。它们需要从您看到脸部的方向顺时针方向。一个简单的提示,如果它们看起来像是wong,只需翻转三角形的2个索引。

这是你的立方体。

tris = new[] {
    0, 2, 1, 2, 3, 1, 
    4, 2, 0, 6, 2, 4, 
    4, 5, 6, 6, 5, 7, 
    1, 3, 5, 3, 7, 5,
    0, 1, 4, 4, 1, 5,
    2, 6, 3, 6, 7, 3
};

如果你想知道为什么它有这么奇怪的阴影,那么用24个顶点创建一个立方体并看看差异。这是因为面上的法线取决于构成顶点的法线的法线。 (同样适用于顶点颜色和紫外线)。因此,如果您需要尖锐的边缘,与相邻面上的顶点或uv接缝不同的颜色,则需要单个顶点用于面/边(因此在一个点中有2个顶点),因为您只能在顶点上设置这些要素。