質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

684閲覧

Unityでインスタンス化した複数のオブジェクトを1つずつ削除する方法を教えてください。

tetter06

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/08/06 11:14

実現したいこと

ボタンを押すたびにオブジェクトのインスタンスを生成することができました。
このインスタンスをボタンを押すごとに1つずつ削除する方法を知りたいです。
できれば一番新しく生成したインスタンスから削除するようにしたいです。
(スタックのイメージ)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Instantiateで生成したときにStack<T>に積んで
削除時にStackから取り出してDestroyすればいいのではないでしょうか

C#

1Stack<GameObject> stack = new Stack<GameObject>(); 2 3//生成時 4stack.push(Instantiate(prefab)); 5 6 7//削除時 8if(stack.Count != 0) Destroy(stack.pop());

みたいな感じで

投稿2022/08/06 23:54

YAmaGNZ

総合スコア10220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Instantiate()の戻り値が生成されたオブジェクトなので、それを格納しておき、Destroy()で削除すればよいです。

投稿2022/08/06 11:59

fiveHundred

総合スコア9739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetter06

2022/08/06 13:56 編集

GameObject g1 = Instantiate(myCube, myCube.transform.position, myCube.transform.rotation) as GameObject; 試しに上のようなコードで格納しようとしましたがエラーが出ました。。。 間違えている箇所がありましたら教えていただきたいです。
tetter06

2022/08/06 13:57

エラー内容:参照の変換、ボックス変換、アンボックス変換、折り返しの変換、または null 型の変換で、型 'UnityEngine.Transform' を 'UnityEngine.GameObject' に変換できません。
fiveHundred

2022/08/07 02:02

myCubeはGameObject型になっていますか? Transform型になっているような気がしますが。
tetter06

2022/08/07 06:23

ご指摘の通りTransform型になっていたので修正しました。 ありがとうございます。 変数g1に戻り値を格納するところまではできましたが、削除ができません。 具体的には、生成ボタンと削除ボタンに同じスクリプトをあてているのに、削除ボタン側の変数が空のままになってしまうのですが、何が原因だと思われますか? 何度も質問してしまい申し訳ありません。
fiveHundred

2022/08/07 07:44

g1を関数の中で定義しているのであれば、それが原因です。 関数の中で定義された変数は、その関数の中でしか使えず、違う関数内で同じ名前で定義しても、別物なので違う値になります。 複数の関数にまたがる場合は、その変数はクラスに定義する必要があります。 というかそもそも、g1は1つしか格納できないので、YAmaGNZさんのようにStackに格納すべきだと思いますが、違いますか?
tetter06

2022/08/08 08:33

g1を関数外(クラス内)に定義していますが、結果は変わりませんでした。 スタックを使う方法も試しましたが、ボタン1側の処理でスタックにオブジェクトを入れても、なぜかボタン2側のスクリプトではスタックが空になっていて、オブジェクトを削除することができませんでした。。。
fiveHundred

2022/08/08 08:42

ボタン1とボタン2は同じインスタンスになっていますか? 同じスクリプトでも、個々にアタッチすると、別物として扱われますよ。
tetter06

2022/08/08 11:37

Unityでの変数の受け渡しについて調べたところ、public staticで定義することでゲーム全体に変数が保存されることがわかり、求めていた処理が実現できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問