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

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

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

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

Unity

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

Q&A

解決済

1回答

1601閲覧

Destroy()の実行後に起こるエラーの対処法

YjojoS

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/14 06:24

編集2020/06/14 06:25

##質問
カードゲームのシミュレーターを製作しているのですが、デッキの内容を確認するために以下のようなシステムを作ろうとしています。

・Transform DeckにあるGameObjectのリストdeckListの要素を、Buttonを押したときにTransform DeckSceneに生成する。
・もう一度Buttonを押したときにTransform DeckSceneに生成したオブジェクトを削除する。

しかし、二回目にオブジェクトをTransform DeckSceneに生成する際、エラーが発生します。
対処の方法をご存じの方がいらっしゃいましたらご教授願います。
##エラーメッセージ

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

##コード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ButtonController : MonoBehaviour 6{ 7 int i = 0; 8 public void CreateScene(Transform scene) //scene = DeckScene 9 { 10 if (i % 2 == 0) //sceneを表示するときの動作 11 { 12 scene.gameObject.SetActive(true); 13 14 foreach (GameObject x in Deck.deckList) 15 { 16 x.SetActive(true); 17 Instantiate(x,scene); 18 } 19 i++; 20 } 21 22 else if (i % 2 != 0) //sceneを非表示するときの動作 23 { 24 //DeckSenceから手動でカードの取り出しを行うことがあるため、deckListに再代入が必要 25 Deck.deckList.Clear(); 26 foreach (Transform childTransform in scene) 27 { 28 Deck.deckList.Add(childTransform.gameObject); 29 Destroy(childTransform.gameObject); 30 } 31 32 scene.gameObject.SetActive(false); 33 i++; 34 }

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

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

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

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

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

fiveHundred

2020/06/14 06:45

「Deck.deckList.Add(childTransform.gameObject);」でリストに追加した直後にそれを「Destroy(childTransform.gameObject);」で削除しているという処理はどう考えてもおかしいですが、何の意図でそのようにしているのでしょうか?
pepperleaf

2020/06/14 07:09

Addしたので、不要となったから、Destroyしようとしている? でもDestroyは、Addで追加されたデータを破壊しようとしています。 (Addはコピーじゃない!) という事でしょうか?
YjojoS

2020/06/14 07:40

pepperleafさんのおっしゃる通りです。 DeckSceneの子オブジェクトをすべてdeckListに格納した後、deckList内のオブジェクトは残しつつDeckSceneの子オブジェクトのみを削除したい、ということになります。 言葉足らずで申し訳ありません。
guest

回答1

0

ベストアンサー

DeckSceneの子オブジェクトをすべてdeckListに格納した後、deckList内のオブジェクトは残しつつDeckSceneの子オブジェクトのみを削除したい、

これはできません。 と言うより、必要ありません。
deckListに格納したと言ってもオブジェクトが増える(コピー)訳ではないので、削除してはいけません。ここでの Destroyは、格納したオブジェクトを破棄しようとしています。(実体は一つなので)

投稿2020/06/14 08:03

pepperleaf

総合スコア6383

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

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

YjojoS

2020/06/14 10:50

お二人方、ご対応ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問