Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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# 尝试在unity中平滑生成的网格_C#_Unity3d - Fatal编程技术网

C# 尝试在unity中平滑生成的网格

C# 尝试在unity中平滑生成的网格,c#,unity3d,C#,Unity3d,我在创建平滑时遇到了问题,并且我得到了一些不需要的细节 它的工作方式现在我可以控制我如何生成网格,但我有点被迫创建一个函数,试图平滑网格。但是我在所有线程完成后执行的数组排序中出现了一些奇怪的错误,debug.log甚至没有输出任何内容 NullReferenceException:对象引用未设置为对象的实例。 顶点的生成是以多线程方式完成的,所以我不确定这是否会影响我的数组 { for (int i = 0, z = 0; z <= tileMeshSize;

我在创建平滑时遇到了问题,并且我得到了一些不需要的细节 它的工作方式现在我可以控制我如何生成网格,但我有点被迫创建一个函数,试图平滑网格。但是我在所有线程完成后执行的数组排序中出现了一些奇怪的错误,debug.log甚至没有输出任何内容

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

顶点的生成是以多线程方式完成的,所以我不确定这是否会影响我的数组

    {


        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%正确,所以将其解释为提示):

  • 多个线程使用的某些数据(例如顶点数组)未被锁定。这可能是因为多个线程同时试图获取/修改同一段数据,Unity不会这样做
  • Unity有一些内部优化,因此即使在共享数据上使用lock(),也可能导致这种错误行为。当我生成随机地形网格时,AnimationCurve对象有这个问题。在这种情况下,您可以创建所用对象的本地临时副本,并仅在单独线程中使用的函数内使用该副本

  • 通过在第一次创建顶点后添加另一个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;
    }