Unity游戏引擎在尝试使用脚本实时更新网格顶点位置时崩溃

3

在Unity中,我创建了一个脚本,成功生成了由三角形组成的平面网格。该平面有400个顶点(20x20网格),由361个由2个三角形组成的正方形组成,每个三角形包含3个顶点(2166个索引)。如前所述,顶点、索引和法线是在start()函数中设置的,其中顶点被加载到名为vertices的vector3数组中,索引被加载到单个浮点数数组中,法线被加载到vector3数组中。然后在Start()函数中将它们分配给一个表示平面的网格,如下所示:

    mesh.vertices = vertices;
    mesh.triangles = triangles;
    mesh.normals = normals;

在update()函数中,调用了一个函数来计算平面网格(400个顶点)中每个顶点的新位置。
void Update () 
{
    updateMesh ();
    mesh.vertices = vertices;
}

更新网格的函数如下所示:

void updateMesh()                                                                       
{                                                                                           
    //This function will update the position of each vertex in the mesh

    for (float i = 0f; i<1f; i=+0.05f) {
        for (float j = 0f; j<1f; j+=0.05f) {
            pos = (int)((i * 20) + (j*20));
            vertices[pos] = updatePt(j, i);

        }
    }
}

一旦新的顶点被更新,索引和法线保持不变,但是新计算出的顶点位置必须加载到网格对象上。如上所示,在Update()函数中也尝试了这一点。
然而,一旦在Unity中按下播放按钮,引擎就会崩溃,我不确定原因是什么-可能是重新计算函数在Unity渲染之前没有完成其循环吗?(因为当网格有10000个顶点(100x100网格)时出现相同的问题,我已经减少了网格中顶点的数量)。或者是因为我在Update()函数中没有做正确的事情?

编辑器日志显示了什么?你可以在这里找到它:http://docs.unity3d.com/Manual/LogFiles.html - Max Yankov
1
如果您将对updateMesh()方法的调用注释掉,它是否仍会崩溃? - Max Yankov
1
你尝试过使用UploadMeshData()方法吗?http://docs.unity3d.com/ScriptReference/Mesh.UploadMeshData.html - Max Yankov
@golergka - 如果注释掉updateMesh()函数,引擎不会崩溃 - 它会正常渲染平面网格(显然没有更新)。我还没有尝试过UploadMeshData()函数,所以感谢你向我指出它。 - Enchanter
刚刚尝试在Update()函数中调用UploadMeshData()函数,像这样:mesh.UploadMeshData(true); 但Unity仍然崩溃了,虽然值得一试。>< - Enchanter
如果你只运行 updateMesh 方法而没有上传网格数据呢?如果你在与网格顶点完全不相关的数据上运行它,比如抽象的数组?通常情况下,尽可能地将错误局部化是一个好习惯,并且删除一切可以重现错误的内容。 - Max Yankov
2个回答

3

我认为这可能是该行的打字错误。

for (float i = 0f; i<1f; i=+0.05f) {

应该写成+=而不是=+。

可能会陷入无限循环,因为i从未被增加。


搞定了 - 就像你所说的那样,我被困在一个无限循环中 - 当Update()函数中调用updateMesh()函数时,引擎不再崩溃。 - Enchanter

0

我想指出,最好使用整数来迭代有效的二维数组,并完全使用整数运算计算最终的数组索引。例如:

如果您依赖浮点数学,可能会生成像19.99这样的索引。然后将其四舍五入以索引数组。不理想!希望这可以帮助。

    static int meshWidth = 20;
    static int meshHeight = 20;

    void updateMesh()
    {
        for (int i = 0; i< meshHeight; i++) {
            for (int j = 0; j < meshWidth; j++)
            {
                int pos = i * meshWidth + j;

                // Also change updatePt func to receive two ints...
                vertices[pos] = updatePt(j, i); 
            }
        }
    }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接