LoginSignup
25
21

More than 5 years have passed since last update.

[Unity] 動的に生成したオブジェクトへのアクセス(List<>での保持、追加、削除)

Last updated at Posted at 2017-01-31

ある人に「動的に生成したオブジェクトを後から参照したい」と相談したところ
「Listで保持すればいいよ」と教えてもらった。
そうすることで、後からListでオブジェクトにアクセスできる。
(この方法を聞くまでは、オブジェクトに名前をふって、Findで名前検索する方法を考えていた)

以下の例は
インスタンス作成 -> Listで管理 -> Listから削除
という流れ

失敗例は実際にやってしまったケース。

期待通りに動いた例

生成したオブジェクトをListで保持して使うということはできるようになったが、その後、インスタンスを削除したくなった。
以下の方法で削除できた。
ただし方法として正しいかどうかは不明。(もっと王道のやり方があるかもしれない)

GameObjectを作り、GameObjectをListで管理し、GameObjectを削除する流れ

test.cs
    //生成した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すればインスタンスも削除されると勘違いしている。
あくまでリストで参照を保持しなくなるだけ。インスタンスは残り続ける。

test.cs
    //生成した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は残ってしまう)

test.cs
    //生成した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();

25
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
21