Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ある人に「動的に生成したオブジェクトを後から参照したい」と相談したところ
「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();

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした