当我在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);
}
}
}
}
}
}
}
有时它会执行并执行应有的操作。
答案 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或使用另一个布尔值来防止此无限循环。