【问题标题】:Collection was modified enumeration operation may not execute. Unity [duplicate]集合被修改枚举操作可能无法执行。团结[重复]
【发布时间】:2017-09-15 21:08:28
【问题描述】:

我目前正在制作一款 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;
                }
            }
        }
    }
}
}

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

【问题讨论】:

  • 迭代列表时,您根本无法修改列表。这就是错误的状态。您可以将列表复制到一个临时列表中,对其进行迭代并修改原始列表。

标签: c# list unity3d foreach


【解决方案1】:

看看你的这段代码:

foreach (GameObject vision in visions) {
    if (vision == null) {
        visions.Remove (vision);

现在,回头看看你得到的错误:

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

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

有很多方法可以解决这个问题。 一般而言,理想的解决方案是重构您的代码,这样就无需在迭代期间对其进行修改。但是,如果您不想这样做,这个肮脏的修复大部分时间也可以工作:

foreach (GameObject vision in visions.ToList())

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

visions = visions.Where(i => i != null).ToList();

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

【讨论】:

  • 那么我将如何删除空对象?
  • @Jacobhoem 将其添加到我的答案中
  • 我需要一个 using 来使用 Where 结构吗?好像不行
  • @Jacobhoem 你需要包含System.Linq
猜你喜欢
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多