集合被修改,枚举操作可能无法执行。统一

Jac*_*sen 1 c# foreach list unity-game-engine

我目前正在制作一款 RTS 风格的游戏。我制作了这个战争迷雾脚本来让敌人隐形:

void Update () {
    foreach (GameObject enemy in enemies) {
        if (enemy == null) {
            enemies.Remove (enemy);
            continue;
        } else {
            Visible = false;
            foreach (GameObject vision in visions) {
                if (vision == null) {
                    visions.Remove (vision);
                    continue;
                } else {
                    Vector3 point = enemy.GetComponent<Collider> ().ClosestPoint (vision.transform.position);
                    float range = vision.GetComponent<FieldOfView> ().viewRadius;
                    float distance = Vector3.Distance (point, vision.transform.position);
                    if (distance <= range) {
                        Visible = true;
                        break;
                    }
                }
            }
            MeshRenderer render = enemy.GetComponent<MeshRenderer> ();
            if (Visible) {
                if (!render.enabled) {
                    render.enabled = true;
                }
            } else if (!Visible) {
                if (render.enabled) {
                    render.enabled = false;
                }
            }
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

每当敌人的游戏对象被摧毁时,我就会在标题中收到错误消息。我对编程还很陌生,不知道是什么原因导致了这个问题。我在其他有同样问题的线程上环顾了一下自己,但我真的不知道如何解决它。任何帮助表示赞赏。如果需要更多信息,请询问,我会尽力提供。

sty*_*ybl 6

看看你的这段代码:

foreach (GameObject vision in visions) {
    if (vision == null) {
        visions.Remove (vision);
Run Code Online (Sandbox Code Playgroud)

现在,回顾一下您收到的错误:

集合被修改,枚举操作可能无法执行。

它告诉您的是,在使用 foreach 迭代集合时无法修改集合。这包括添加和删除元素以及修改现有元素。

有很多方法可以处理这个问题。一般来说,理想的解决方案是重构代码,以便在迭代期间无需修改它。但是,如果您不想这样做,这个肮脏的修复方法在大多数情况下也将起作用:

foreach (GameObject vision in visions.ToList())
Run Code Online (Sandbox Code Playgroud)

但是,在您的具体情况(删除空值)中,我会执行以下操作:

visions = visions.Where(i => i != null).ToList();
Run Code Online (Sandbox Code Playgroud)

这将删除所有空元素。然后你再迭代它。