40332


スクリプトは動いています。だけど腑に落ちないので質問します。  
ballsという名前でListを作り、その中にballオブジェクトが10個入っている状態で、その中のballを全て削除したくてfor文を書きました。

[code]

    for (var num = balls.Count -1; 0 < balls.Count; num--) {
            balls.RemoveAt (num);
    
[/code]

前から消したら処理中にリストの長さが変わると思ったのでケツから消してます。でもこの方法ではballsリストは0になったけど、ヒエラルキー上のオブジェクトは消えてくれませんでした。リストの登録のみを削除したようです。なので次にこう書きました

[code]

    for (var num = balls.Count -1; 0 < balls.Count; num--) {
            Destroy (balls[num]);
        }
    
[/code]

オブジェクトは消えてくれました。でもMissingReferenceExceptionが発生しました。いわゆるヌルポです。原因がわからないのでブレイクポイントを置いてみてみました  
[![Countが減らない](https://i.stack.imgur.com/MrhZt.png)](https://i.stack.imgur.com/MrhZt.png)

ループが回ってオブジェクトが削除されてもballs.Countが減ってません。Countメソッドは何を参照してるんでしょう？それともDestroyだと何か残骸が残るんでしょうか？  
結局のところオブジェクトの削除だけであれば頭から消しても問題ありません(balls.Countは10のままですが)。どっちも綺麗にするなら、

[code]

     for (var num = balls.Count -1; 0 < balls.Count; num--) {
            Destroy (balls[num]); //オブジェクトの削除
            balls.RemoveAt (num); //リストの削除
        }
    
[/code]

こんな風に二度手間になります。これでも動くけどもっとクールな方法があるはずですよね？


CC BY-SA 3.0
2017-12-16T14:43:54.663
40327
2017-12-16T23:35:00.037
26678
question
c# unity3d
for文でlist内GameObjectの削除時の挙動


`Destroy(object,
float)`メソッドはあくまでリストに含まれる各`GameObject`を引数として受け取っているだけであって、呼び出し元でどのような変数からどうやって値を取り出したかなど関知しておりません。ですから`Destroy`しても`balls`に対する操作が行われないのはごく当然の仕様です。

`foreach`で`Destroy`してから`balls.Clear()`を呼ぶのがシンプルなのでは。


CC BY-SA 3.0
2017-12-16T23:35:00.037
40332
2017-12-16T23:35:00.037
5750
40327
answer