我的C#函数导致Unity在播放时冻结

时间:2018-11-13 16:14:56

标签: c# unity3d

当我在Unity中按Play时,它会冻结(大部分时间。只有很少的时间它有效)

这似乎是问题所在的功能:

    void SeperateCells() {
        // Seems to already crash here.
        bool cellCollision = true;
        int loop = 0;
        while (cellCollision) {
            loop++;
            cellCollision = false;
            if (debug) {
                Debug.Log("Loop " + loop);
            }

            for (int i = 0; i < cells.Count; i++) {
                GenCell c = cells[i];
                for (int j = i + 1; j < cells.Count; j++) {
                    GenCell cb = cells[j];
                    if (c.CollidesWith(cb)) {
                        cellCollision = true;

                        int cb_x = Mathf.RoundToInt((c.x + c.width) - cb.x);
                        int c_x = Mathf.RoundToInt((cb.x + cb.width) - c.x);
                        int cb_y = Mathf.RoundToInt((c.y + c.height) - cb.y);
                        int c_y = Mathf.RoundToInt((cb.y + cb.height) - c.y);

                        if (c_x < cb_x) {
                            if (c_x < c_y) {
                                c.Shift(c_x, 0);
                            }
                            else {
                                c.Shift(0, c_y);
                            }
                        }
                        else {
                            if (cb_x < cb_y) {
                                cb.Shift(cb_x, 0);
                            }
                            else {
                                cb.Shift(0, cb_y);
                            }
                        }
                    }
                }
            }
        }
    }

有时它会执行并执行应有的操作。

1 个答案:

答案 0 :(得分:2)

您的问题在这里

while (cellCollision) {
        loop++;
        cellCollision = false;

在这里

if (c.CollidesWith(cb)) {
        cellCollision = true;

基本上,当它第一次通过while循环时,这里发生的事情只需要执行一次,因为cellCollision经过一次之后就被设置为false,因此不需要再次循环。然后,一旦c.CollidesWith(cb)为真,它将再次使cellCollision为真,从而使其再次经历循环。除非您有办法将c.CollidesWith(cb)更改为false,否则它将变成无限循环,因此您需要再次使c.CollidesWith(cb)为false或使用另一个布尔值来防止此无限循环。