C# 尝试在unity中平滑生成的网格
我在创建平滑时遇到了问题,并且我得到了一些不需要的细节 它的工作方式现在我可以控制我如何生成网格,但我有点被迫创建一个函数,试图平滑网格。但是我在所有线程完成后执行的数组排序中出现了一些奇怪的错误,debug.log甚至没有输出任何内容 NullReferenceException:对象引用未设置为对象的实例。 顶点的生成是以多线程方式完成的,所以我不确定这是否会影响我的数组C# 尝试在unity中平滑生成的网格,c#,unity3d,C#,Unity3d,我在创建平滑时遇到了问题,并且我得到了一些不需要的细节 它的工作方式现在我可以控制我如何生成网格,但我有点被迫创建一个函数,试图平滑网格。但是我在所有线程完成后执行的数组排序中出现了一些奇怪的错误,debug.log甚至没有输出任何内容 NullReferenceException:对象引用未设置为对象的实例。 顶点的生成是以多线程方式完成的,所以我不确定这是否会影响我的数组 { for (int i = 0, z = 0; z <= tileMeshSize;
{
for (int i = 0, z = 0; z <= tileMeshSize; z++)
{
for (int x = 0; x <= tileMeshSize; x++)
{
float y = TerrainBasicGeology.CreatingY(x + tileData.xStartPos, z + tileData.zStartPos, perlinNoiseScale, perlinNoiseHeigh, tileData);
tileData.vertices[i] = new Vector3((x * tileSizeScaleModifier), (y * tileSizeScaleModifier), (z * tileSizeScaleModifier));
i++;
}
}
Vector3[] tempVector = TerrainBasicGeology.SmoothingTile(tileData, tileThreadContainer, tileMeshSize, tileSizeScaleModifier, perlinNoiseScale, perlinNoiseHeigh);
Array.Clear(tileData.vertices,0, tileData.vertices.Length);
tileData.vertices = tempVector;
我想我的问题是使用TerrainBasicGeology.SmoothingFile时出现的,但我不确定是不是因为我遇到了一个与函数没有直接连接的错误,而Debug.log没有说任何话。
我错了什么?
任何指针都很好。我认为问题可能是由两个原因造成的(虽然可能不是100%正确,所以将其解释为提示):
通过在第一次创建顶点后添加另一个for循环,解决了我的问题。然后,只需从柏林函数中收集我想要平滑的顶点周围不同点的平均值
for (int i = 0, z = 0; z <= tileMeshSize; z++)
{
for (int x = 0; x <= tileMeshSize; x++)
{
//Smoothing
float y = TerrainBasicGeology.SmoothingY(x + tileData.xStartPos, z + tileData.zStartPos, perlinNoiseScale, perlinNoiseHeigh, tileData);
tileData.vertices[i] = new Vector3((tileData.tileContainer.baseVertices[i].x), (y), (tileData.tileContainer.baseVertices[i].z));
Vector3 continentAreaVector = new Vector3((tileData.tileContainer.baseVertices[i].x), (y), (tileData.tileContainer.baseVertices[i].z));
i++;
}
}
for(int i=0,z=0;z)我在问题中添加了另一部分,这可能会澄清这一部分,但我已经为单独的线程创建了单独的数组。因此线程应该写入自己的数组。请查看我添加的代码tasks[x]=Task.Run(()=>Terraingerator.CreatingTile(tileCQ,tileThreadContainer[x],TilArrayData[x],tileMeshSize,tileSizeScaleModifier,perlinNoiseScale,PerlinNoiseHigh));
当我不使用TerrainBasicGeology.SmoothingFile时,一切都正常。
tasks[x] = Task.Run(() => TerrainGenerator.CreatingTile(tileCQ, tileThreadContainer[x], tileArrayData[x], tileMeshSize, tileSizeScaleModifier, perlinNoiseScale, perlinNoiseHeigh));
for (int i = 0, z = 0; z <= tileMeshSize; z++)
{
for (int x = 0; x <= tileMeshSize; x++)
{
//Smoothing
float y = TerrainBasicGeology.SmoothingY(x + tileData.xStartPos, z + tileData.zStartPos, perlinNoiseScale, perlinNoiseHeigh, tileData);
tileData.vertices[i] = new Vector3((tileData.tileContainer.baseVertices[i].x), (y), (tileData.tileContainer.baseVertices[i].z));
Vector3 continentAreaVector = new Vector3((tileData.tileContainer.baseVertices[i].x), (y), (tileData.tileContainer.baseVertices[i].z));
i++;
}
}
public static float SmoothingY(int xPos, int zPos, int perlinNoiseScale, int perlinNoiseheigh, TileData tileData)
{
float averageY = .0f;
int smoothValue = 10;
int i = 0;
for (int z = -2; z <= 2; z++)
{
for (int x = -2; x <= 2; x++)
{
averageY = averageY + CreatingY((x + xPos) * smoothValue, (z + zPos) * smoothValue, perlinNoiseScale, perlinNoiseheigh, tileData);
i++;
}
}
float newY = averageY / (i + 1);
return newY;
}