Unityでスクリプトで動的に作成したオブジェクトをすでに存在するオブジェクトの子として登録することはよくあると思います。
で、登録したからには削除したい!ってことも当然出てきます。
なので今回は子オブジェクトをすべて削除する方法をご紹介。
実装方法
まずざっくりとコードをご紹介。
using System.Linq; public class ChildDestroyTest: MonoBehaviour public void ChildDestroy(GameObject parent) { //parentには削除したい子オブジェクトたちの親オブジェクトを指定する //子供オブジェクトを全部消す var uiobj = GetChildren(parent); foreach (GameObject child in uiobj) { Destroy(child); } } //子オブジェクトをGameObjectとして取得する private GameObject[] GetChildren(GameObject parent) { // 見つからなかったらreturn if (parent == null) return null; // 子のTransform[]を取り出す var transforms = parent.GetComponentsInChildren(); // 使いやすいようにtransformsからgameObjectを取り出す var gameObjects = from t in transforms select t.gameObject; // 配列に変換してreturn return gameObjects.ToArray(); } }
※子オブジェクトをGameObject型として取得する方法はめおしーえす様(【Unity】全ての子オブジェクトをGameObject[]型で取得する Unity)を参考にしました。
使い方
Gameobject p_object = GameObject.Find(“ObjectParent”);
p_object.GetComponent<ChildDestroyTest>().ChildDestroy(p_object);
この例では「ObjectParent」というオブジェクトにあらかじめ「ChildDextroyTest.cs」スクリプトをアタッチしておきます。
そしてFindで変数p_objectに格納したのち、p_objectからコンポーネントとして呼び出してChildDestroy関数を呼び出しています。
関数を呼び出す際に親オブジェクト(例ではp_object)変数を渡してあげるのがポイントです。
補足
書いてて思いましたが、別にオブジェクトにスクリプトをアタッチしなくてもChildDestroy関数をpublic staticとして宣言してあげれば使えるのでは…?
今度なにかで試してみます!
スポンサードサーチ
ちょっとした解説
スクリプトから子オブジェクトを取得する方法としてforeach有名かと思います。
foreach (Transform child in transform) { //すべての子オブジェクトを消す Destroy(child); }
で、素直にこんな感じでコードを書いたところ以下のようなエラーとなりました。
Can’t remove RectTransform because Image (Script) depends on it
意味としては「 Image (Script) が依存してるから消せないぞ」ということですが、ざっくりいうと「transformのままじゃ消させねーぞ。オブジェクトにしやがれ!」ってな感じになります。
ということで、子オブジェクトたちを一度Gameobject型の配列に変換し、その変換したものにforeachをかけて消してあげrる必要があります。
スポンサードサーチ
まとめ
正直なところもう少しスマートなやり方がありそうですが、現状これでうまくいってるのでよしとしています。
もっといい感じのやり方ご存知の方おられましたら、ぜひ教えてください!