运行时无限循环错误
Endless Loop Error at Runtime
我在这个程序中尝试做的是创建一个带有标签 "Cube".
的 GameObjects 的 3 维数组
当我创建数组 cb 时,立方体的名称顺序是乱序的(每个立方体都根据其在复合 unity 3d 立方体中的位置命名,例如:Cube000、Cube102)。因此,我不得不对其进行排序。
我尝试创建一个排序方法(我知道它效率不高),每次我 运行 它,我都会陷入无限循环,Unity 停止响应。
代码的第二部分旨在用数组 cb 的有序元素填充 3d 数组。我怀疑这是问题所在,但请随时检查。
另请注意,主立方体是空心的,因此里面只有 26 个小立方体,而不是 27 个。无论如何,为什么我会出现无限循环?
using UnityEngine;
using System.Collections;
public class CubeArrayLoop : MonoBehaviour {
public GameObject[,,] cubes = new GameObject[3, 3, 3];
public void Start(){
//initialize array of Cube GameObjects
GameObject[] cb = new GameObject[26];
cb = GameObject.FindGameObjectsWithTag("Cube");
//sort array of Cube GameObjects
for (int p = 1; p < cb.Length; p++) {
GameObject first = cb [0];
GameObject current = cb [p];
GameObject replacer;
if (current.name.CompareTo (first.name) < 0) {
replacer = first;
first = current;
current = replacer;
p = 1;
}
}
//Debug.Log (cb);
//fill class variable cubes with cb objects in depth, row, col order
int count = 0;
for (int d =0; d < 3; d++) {
for (int r = 0; r < 3; r++) {
for (int c =0; c < 3; c++) {
if (!(d == 1 && r == 1 && c == 1)) {
cubes[d, r, c] = cb[count];
count += 1;
}
else{
cubes[d, r, c] = null;
}
}
}
}
//Debug.Log(cubes[1,2,1]);
}
}
为此类工作编写自己的排序例程不是一个好主意,尤其是当您不知道如何高效地完成它时。 .NET 提供了许多很好的排序方法。我鼓励您学习如何实现排序例程,但将其作为一个单独的项目进行。
using System.Collections.Generic;
class GameObjectComparer : IComparer<GameObject>
{
public int Compare(GameObject left, GameObject right)
{
return left.Name.CompareTo(right.Name);
}
}
//sort array of Cube GameObjects
Array.Sort(cb, new GameObjectComparer());
我在这个程序中尝试做的是创建一个带有标签 "Cube".
的 GameObjects 的 3 维数组当我创建数组 cb 时,立方体的名称顺序是乱序的(每个立方体都根据其在复合 unity 3d 立方体中的位置命名,例如:Cube000、Cube102)。因此,我不得不对其进行排序。
我尝试创建一个排序方法(我知道它效率不高),每次我 运行 它,我都会陷入无限循环,Unity 停止响应。
代码的第二部分旨在用数组 cb 的有序元素填充 3d 数组。我怀疑这是问题所在,但请随时检查。
另请注意,主立方体是空心的,因此里面只有 26 个小立方体,而不是 27 个。无论如何,为什么我会出现无限循环?
using UnityEngine;
using System.Collections;
public class CubeArrayLoop : MonoBehaviour {
public GameObject[,,] cubes = new GameObject[3, 3, 3];
public void Start(){
//initialize array of Cube GameObjects
GameObject[] cb = new GameObject[26];
cb = GameObject.FindGameObjectsWithTag("Cube");
//sort array of Cube GameObjects
for (int p = 1; p < cb.Length; p++) {
GameObject first = cb [0];
GameObject current = cb [p];
GameObject replacer;
if (current.name.CompareTo (first.name) < 0) {
replacer = first;
first = current;
current = replacer;
p = 1;
}
}
//Debug.Log (cb);
//fill class variable cubes with cb objects in depth, row, col order
int count = 0;
for (int d =0; d < 3; d++) {
for (int r = 0; r < 3; r++) {
for (int c =0; c < 3; c++) {
if (!(d == 1 && r == 1 && c == 1)) {
cubes[d, r, c] = cb[count];
count += 1;
}
else{
cubes[d, r, c] = null;
}
}
}
}
//Debug.Log(cubes[1,2,1]);
}
}
为此类工作编写自己的排序例程不是一个好主意,尤其是当您不知道如何高效地完成它时。 .NET 提供了许多很好的排序方法。我鼓励您学习如何实现排序例程,但将其作为一个单独的项目进行。
using System.Collections.Generic;
class GameObjectComparer : IComparer<GameObject>
{
public int Compare(GameObject left, GameObject right)
{
return left.Name.CompareTo(right.Name);
}
}
//sort array of Cube GameObjects
Array.Sort(cb, new GameObjectComparer());