ある人に「動的に生成したオブジェクトを後から参照したい」と相談したところ
「Listで保持すればいいよ」と教えてもらった。
そうすることで、後からListでオブジェクトにアクセスできる。
(この方法を聞くまでは、オブジェクトに名前をふって、Findで名前検索する方法を考えていた)
以下の例は
インスタンス作成 -> Listで管理 -> Listから削除
という流れ
失敗例は実際にやってしまったケース。
#期待通りに動いた例
生成したオブジェクトをListで保持して使うということはできるようになったが、その後、インスタンスを削除したくなった。
以下の方法で削除できた。
ただし方法として正しいかどうかは不明。(もっと王道のやり方があるかもしれない)
GameObjectを作り、GameObjectをListで管理し、GameObjectを削除する流れ
//生成したObjectを持っておくためのList
List<GameObject> list_toggle_ = new List<GameObject>();
//インスタンスを作成
GameObject toggle_instance = Instantiate(toggle_prefab_) as GameObject;
//生成したインスタンスをリストで持っておく
list_toggle_.Add(toggle_instance);
//リストで保持しているインスタンスを削除
for (int i = 0; i < list_toggle_.Count; i++)
{
Destroy(list_toggle_[i]);
}
//リスト自体をキレイにする
list_toggle_.Clear();
#失敗例1
リストをClearすればインスタンスも削除されると勘違いしている。
あくまでリストで参照を保持しなくなるだけ。インスタンスは残り続ける。
//生成したObjectを持っておくためのList
List<GameObject> list_toggle_ = new List<GameObject>();
//インスタンスを作成
GameObject toggle_instance = Instantiate(toggle_prefab_) as GameObject;
//生成したインスタンスをリストで持っておく
list_toggle_.Add(toggle_instance);
//リスト自体をキレイにする
list_toggle_.Clear();
#失敗例2
Toggleを使いたいのでGameObjectではなくてToggleを取り出してリストで保持しているケース。
この状態でDestroyを呼ぶとインスタンスのToggleコンポーネントだけ削除される。
つまりGameObjectのインスタンス自体は残り続ける。
GameObjectを作り、ToggleをListで管理し、Toggleを削除する流れ(GameObjectは残ってしまう)
//生成したObjectを持っておくためのList(ただしToggleクラスのリストを保持する)
List<Toggle> list_toggle_ = new List<GameObject>();
//インスタンスを作成(ただしGameObject)
GameObject toggle_instance = Instantiate(toggle_prefab_) as GameObject;
//生成したインスタンスをリストで持っておく(GameObject内部のToggleを取り出してリストに入れる)
list_toggle_.Add(toggle_instance.GetComponent<Toggle>());
//リストで保持しているインスタンスを削除()
for (int i = 0; i < list_toggle_.Count; i++)
{
Destroy(list_toggle_[i]);
}
//リスト自体をキレイにする
list_toggle_.Clear();