Моя функция C # заставляет Unity зависать при игре - PullRequest
0 голосов
/ 13 ноября 2018

Когда я нажимаю кнопку воспроизведения в Unity, она зависает (большую часть времени. Лишь очень мало раз работает)

Похоже, проблема в этой функции:

    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 голосов
/ 13 ноября 2018

Ваша проблема здесь

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

и здесь

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

По сути, то, что происходит здесь, когда он впервые проходит цикл while, нужно только сделать этоодин раз, потому что cellCollision становится ложным после того, как он прошел один раз, поэтому ему не нужно повторять цикл.Затем, когда значение c.CollidesWith(cb) становится истинным, оно снова становится истинным cellCollision, заставляя его снова пройти цикл.Если у вас нет способа изменить c.CollidesWith(cb) на false, он станет бесконечным циклом, поэтому вам нужно снова сделать c.CollidesWith(cb) false или использовать другое логическое значение, чтобы предотвратить этот бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...