【 Unity 】スクリプトから子オブジェクトをすべて削除する方法

【Unity】スクリプトから子オブジェクトをすべて削除する方法

Unity で子オブジェクトをすべて削除する方法

スクリプトから子オブジェクトを全て削除する方法を紹介します。

親オブジェクトの Transform コンポーネント内のすべての子オブジェクトを foreach で繰り返し処理します。そして、各子オブジェクトを削除するためにGameObject.Destroy()関数を使用します。

以下に、C# で書かれた具体的なコードを示します。

// parentObject のすべての子オブジェクトを削除
foreach (Transform child in parentObject.transform)
{
    GameObject.Destroy(child.gameObject);
}

このコードは、親オブジェクトの Transform コンポーネント内のすべての子オブジェクトを繰り返し処理し、各子オブジェクトを削除します。ここでparentObject.transformは親オブジェクトの Transform コンポーネントを指し、childはその子オブジェクトを指します。

GameObject.Destroy() を使う際の注意点

GameObject.Destroy()は、削除を即時に行うのではなく、現在のフレームの終了時に削除を行います。

そのため、同じフレーム内で子オブジェクトを削除した後にそれにアクセスしようとすると、予期しない結果を引き起こす可能性があります。この問題を避けるためには、子オブジェクトを削除する前に必要な操作をすべて完了させておくことが重要です。

子オブジェクトの全削除を拡張メソッド化する

以下にTransformExtensions クラスに子オブジェクトを全て削除する拡張メソッドを追加する例を示します。これにより、Unity の任意の Transform オブジェクトから直接 .DestroyAllChildren() メソッドを呼び出すことができます。

using UnityEngine;

public static class TransformExtensions
{
    public static void DestroyAllChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            GameObject.Destroy(child.gameObject);
        }
    }
}

拡張メソッドを追加すると、次のように使用することができます。

myGameObject.transform.DestroyAllChildren();

このコードは myGameObject のすべての子オブジェクトを削除します。ここで myGameObject は子オブジェクトを削除したい親オブジェクトを参照しています。

拡張メソッドを使用することで、コードの読みやすさと再利用性が向上します。

参考資料