2017-09-15 77 views
-1

我目前正在製作RTS風格的遊戲。我做了這樣的大霧戰爭腳本的製作enimies無形:已被修改的枚舉操作可能無法執行。 Unity

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; 
       } 
      } 
     } 
    } 
} 
} 

每當敵人gamobject被摧毀,我的稱號得到的錯誤。我在編程方面仍然很新,並沒有看到可能導致問題的原因。 我在其他線程上查看了一下自己的問題,但是我沒有真正知道如何解決這個問題。 任何幫助表示讚賞。如果需要更多信息,請詢問我將盡力提供。

+0

當你迭代它時,你根本無法修改列表。這就是錯誤所指的。您可以將您的列表複製到臨時列表,重複此操作並修改原始列表。 – HimBromBeere

回答

0

看看該位代碼的:

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(); 

這將刪除所有空元素。然後你在之後迭代它。

+0

我將如何去刪除空對象呢? –

+0

@Jacobhoem添加到我的答案 – stybl

+0

我是否需要使用Where結構?似乎不起作用 –

相關問題