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

Unity Game Engine Crashing When Trying To Update The Vertex Positions Of A Mesh In Real Time Using A Script

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

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

在 update() 函数中调用了一个函数,该函数计算平面网格 (400) 中每个顶点的新位置:

void Update () 
{
    updateMesh ();
    mesh.vertices = vertices;
}

updateMesh 函数如下所示:

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() 函数中没有做正确的事情?

我认为这可能是行中的错字

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

它应该读作 += 而不是 =+ 。

它可能陷入无限循环,因为 i 永远不会递增。

我只想指出,使用整数遍历有效的二维数组并完全使用整数数学计算最终数组索引会好得多。例如

如果你依赖浮点数学,你可能会生成像 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); 
            }
        }
    }