Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未使用不同材质Unity2D显示子网格_C#_Unity3d_Mesh - Fatal编程技术网

C# 未使用不同材质Unity2D显示子网格

C# 未使用不同材质Unity2D显示子网格,c#,unity3d,mesh,C#,Unity3d,Mesh,我有一些代码可以创建一个圆形网格,它需要一个半径、多个边(对于一个圆,它被选择为100左右)和一个轮廓宽度。它初始化网格,如下所示: MeshFilter mf = GetComponent<MeshFilter>(); Mesh mesh = new Mesh(); mf.mesh = mesh; mesh.subMeshCount = 2; //initialise mesh.vertices = vertices; mesh.normals = normals; mesh.

我有一些代码可以创建一个圆形网格,它需要一个半径、多个边(对于一个圆,它被选择为100左右)和一个轮廓宽度。它初始化网格,如下所示:

MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;

mesh.subMeshCount = 2;
//initialise
mesh.vertices = vertices;
mesh.normals = normals;
mesh.SetTriangles(triangles, 0);
mesh.SetTriangles(OLtriangles, 1);
所有法线都只是
-Vector3。向前

//normals
List<Vector3> normalsList = new List<Vector3> { };
for (int i = 0; i < vertices.Length; i++)
{
    normalsList.Add(-Vector3.forward);
}
Vector3[] normals = normalsList.ToArray();
因此,完整的代码如下所示(在末尾设置了一个聚合收集器,但这与此无关):

public void多边形网格(浮动半径、整数n、浮动宽度)
{
MeshFilter mf=GetComponent();
网格=新网格();
mf.mesh=网格;
mesh.submishcount=2;
//顶点
列表垂直列表=新列表{};
浮动x;
浮动y;
对于(int i=0;i
就我所知,这应该设置两个网格,一个稍大一点。这是可行的,但是,尽管为网格渲染器指定了两种不同的材质,但它们始终显示为相同的颜色

以下是网格在游戏中的显示方式:

这清楚地表明有两个网格:

我的网格渲染器如下所示:

MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;

mesh.subMeshCount = 2;
//initialise
mesh.vertices = vertices;
mesh.normals = normals;
mesh.SetTriangles(triangles, 0);
mesh.SetTriangles(OLtriangles, 1);

这些是正在使用的材料:

我尝试过在渲染器中简单地交换材质,但这只会使对象成为具有其他材质的单个材质

在进一步的实验之后,我想澄清这不是由Z-fighting引起的,我已经通过更改轮廓的Z坐标进行了实验,并实时更改了材质,无论出于何种原因,它们都具有相同的材质。

您的“轮廓”网格构造不正确。 事实上,您的“轮廓”网格是一个圆,而不是一个环

因此,当渲染整个对象时,轮廓和内部部分位于同一位置。如果你把摄像机移开,我想你会看到一些的

要正确渲染对象,需要为轮廓创建一个环

其次,将两个“子画面”合并为一个三角形数组:

List<int> trianglesList = new List<int> { };
List<int> OLtrianglesList = new List<int> { };
for (int i = 0; i < (n - 2); i++)
{
    trianglesList.Add(0);
    trianglesList.Add(i + 1);
    trianglesList.Add(i + 2);
}
for (int i = 0; i < (n - 2); i++)
{
    trianglesList.Add(n);
    trianglesList.Add(i + n + 1);
    trianglesList.Add(i + n + 2);
}

我可以不使用它,使轮廓圆呈现在另一个圆的“后面”吗?不必渲染戒指?我有一个长方体和斜面对象,使用相同的方法,它们似乎可以处理相同形状的较大网格,在另一个后面,但你必须确保轮廓垂直的Z值与内部部分的Z值不同。它只会从一侧看起来像一个轮廓。所以经过一点测试,我确定了问题与Z格斗无关,每个网格都有相同的材质,不管我看到什么,就我所看到的顶点在同一个列表中来说,应该可以,但是的,OltriangelList没有使用,谢谢你发现它
List<int> trianglesList = new List<int> { };
List<int> OLtrianglesList = new List<int> { };
for (int i = 0; i < (n - 2); i++)
{
    trianglesList.Add(0);
    trianglesList.Add(i + 1);
    trianglesList.Add(i + 2);
}
for (int i = 0; i < (n - 2); i++)
{
    trianglesList.Add(n);
    trianglesList.Add(i + n + 1);
    trianglesList.Add(i + n + 2);
}
for (int i = 0; i < n; i++)
{
    x = radius * Mathf.Sin((2 * Mathf.PI * i) / n);
    y = radius * Mathf.Cos((2 * Mathf.PI * i) / n);
    verticesList.Add(new Vector3(x, y, 0f));
}
for (int i = 0; i < n; i++)
{
    x = (radius + OLwidth) * Mathf.Sin((2 * Mathf.PI * i) / n);
    y = (radius + OLwidth) * Mathf.Cos((2 * Mathf.PI * i) / n);
    verticesList.Add(new Vector3(x, y, 0f));
}