2017-09-15 19 views
-1

私は現在RTSスタイルのゲームを作っています。私は目に見えないenimiesを作るための戦争スクリプトのこの霧を作った:コレクションが変更された列挙操作が実行されない可能性があります。 Unity

敵gamobjectが破壊されますたび
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; 
       } 
      } 
     } 
    } 
} 
} 

、私はタイトルにエラーが発生します。私はまだかなりプログラミングの新しいと問題を引き起こす可能性がある参照してください。 私は同じ問題を持って他のスレッドでちょっと見ていましたが、実際にそれを修正する方法はありません。 何か助けていただければ幸いです。それ以上の情報が必要な場合は、尋ねてみてください。

+0

あなたは* iterating *している間は、単にリストを変更することはできません。それがエラーの内容です。あなたはリストを一時的なものにコピーし、それを反復してオリジナルを修正することができます。 – HimBromBeere

答えて

0

あなたのコードのこのビットを見てみましょう。

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

、あなたが取得しているエラーを振り返る:

コレクションは、列挙操作が実行されないことがあり修正しました。

foreachを使用してコレクションを反復しながらコレクションを変更することはできません。これには、要素の追加や削除、既存の要素の変更が含まれます。

この問題を処理する方法はたくさんあります。 一般的にはですが、理想的な解決策は、コードをリファクタリングして反復処理中に変更する必要がないようにすることです。あなたはしかし、それを行うにはしたくない場合は、この汚れた修正プログラムはまた、ほとんどの時間を動作します:

visions = visions.Where(i => i != null).ToList(); 
:しかし、(ヌルの除去)あなたの特定のケースで

foreach (GameObject vision in visions.ToList()) 

を、私は次のことを行うだろう

これにより、すべてのnull要素が削除されます。その後、あなたはそれを反復処理します。

+0

どうすれば空のオブジェクトを削除できますか? –

+0

@Jacobhoemそれを私の答えに追加しました – stybl

+0

Where構造体を使用するには? doesntは動作するようです。 –

関連する問題