[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
2022-02-21 11:17:34
質問内容
以下のスクリプトをゲームオブジェクトにアタッチし、エディターでボタンをクリックすると実行されるようにしています。
public void ClearChildren() {
Debug.Log(transform.childCount);
float i = 0;
foreach (Transform child in transform) {
i += 1;
DestroyImmediate(child.gameObject);
}
Debug.Log(transform.childCount);
}
これを見ると、元の
childCount
は13で、最終的な値は6です。さらに、すべての
i
これは、ループが7回しか実行されておらず、期待された13回ではないことを示しています。
最終的な値が0になるように、すべての子を削除するにはどうしたらよいでしょうか。参考までに、私が削除しようとしているchildrenは、ベンダーのスクリプトによって自動的に作成されたものです。また、このスクリプトを
[ExecuteInEditMode]
参考までに
次のスクリプトも同じ動作で、もし
childCount
は 4 で始まり、2 で終わります。
public void ClearChildren() {
Debug.Log(transform.childCount);
for (int i = 0; i < transform.childCount; i++) {
Transform child = transform.GetChild(i);
DestroyImmediate(child.gameObject);
}
Debug.Log(transform.childCount);
}
以下のように試すと、ランタイムエラーが発生します。
foreach
という行があります。
InvalidCastException: 送信元の型から送信先の型にキャストできません。
public void ClearChildren() {
Debug.Log(transform.childCount);
foreach ( GameObject child in transform) {
DestroyImmediate(child);
}
Debug.Log(transform.childCount);
}
解決方法は?
問題は、forループでObjectにアクセスしながら削除しようとしていることです。
こうすればいいのです。
-
すべての子オブジェクトを検索し、配列に格納します。
-
別のループでそれらを破棄する
public void ClearChildren() { Debug.Log(transform.childCount); int i = 0; //Array to hold all child obj GameObject[] allChildren = new GameObject[transform.childCount]; //Find all child obj and store to that array foreach (Transform child in transform) { allChildren[i] = child.gameObject; i += 1; } //Now destroy them foreach (GameObject child in allChildren) { DestroyImmediate(child.gameObject); } Debug.Log(transform.childCount); }
関連
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] ディレクトリ内のすべてのファイルやフォルダを削除する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】IntPtrとは一体何なのか?