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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

3回答

1941閲覧

値を返した後にゲームオブジェクトをDestroyしたい

Carly7766

総合スコア33

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2019/08/11 06:48

編集2019/08/11 07:20

Unityで、値を返した後にそのコンポーネントがついているGameObjectをDestroyしたいのですが

cs

1public int hoge() { 2 return 1; 3 Destroy(this.gameobject); //Destroyが呼ばれない 4} 5 6public int Piyo() { 7 Destroy(this.gameobject); 8 return 1; //動くが例外が飛ぶ 9}

という問題で困っています。

例外の内容は
MissingReferenceException: The object of type 'Class Name' has been destroyed but you are still trying to access it.

よろしくお願いします

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

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

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

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

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

fiveHundred

2019/08/11 07:18

その例外の内容を質問文に編集する形で記載してください。
Bongo

2019/08/12 19:37

Piyoの方ならうまくいきそうに思ったのですが、ダメでしたか...? Piyoの場合にMissingReferenceExceptionが発生する行周辺のコードもご提示いただけませんでしょうか(多分「return 1;」とは別の行だと思うのですが...)。おそらく修正するべきはそちらの方のような気がします。 fiveHundredさんが回答中でご指摘しているように、破壊後...たとえば次のフレームなどでアクセスしようとしているんじゃないでしょうか。
guest

回答3

0

すみません。時間が経ってしまいましたが事故解決しました。
クラスの依存関係がおかしいからこんなことになる訳なので素直に設計を見直しました。
具体的には

c#

1public class Hoge : MonoBehaviour 2{ 3 int num = 0; 4 public GetValue() 5 { 6 return num + 1; 7 } 8 9 public Die() 10 { 11 Destroy(this.gameObject); 12 } 13} 14 15public class Piyo : MonoBehaviour 16{ 17 [SerializeField] 18 private Hoge hoge; 19 20 public Awake() 21 { 22 Debug.Log(hoge.GetValue()); 23 hoge.Die(); 24 } 25}

のように関数を呼ぶ側が必要な関数を呼んだ後にHoge自身を消す関数を呼ぶようにしました。
必要に応じてDie()に消す前に必要な処理を書いておくといいと思います。

投稿2020/05/02 02:38

編集2020/05/02 03:03
Carly7766

総合スコア33

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

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

0

Coroutineを使うのはどうでしょうか

cs

1int hoge(){ 2 StartCoroutine("LatorDestroy"); 3 return 1; 4} 5 6IEnumerator LatorDestroy() { 7 yield return new WaitForSeconds(0.1f); 8 Destroy(this.gameObject); 9}

0.1秒後に消す、という処理ですが

yield return null;

でも大丈夫だと思います

投稿2019/08/12 10:58

yuto_onizakura

総合スコア52

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

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

0

ベストアンサー

Destroy()すると、このスクリプト自身も消えてしまいます。
この場合に、その消えたスクリプトを動かそうとしているために、例外が出ているのだと思います。

また、returnは「関数を『終了』して値を返す」というものなので、それ以降の処理は当然行われません。

「値を返す」のみにしてDestroy()は他のスクリプトで行うようにすればいいのではないでしょうか?

投稿2019/08/11 07:24

編集2019/08/11 07:29
fiveHundred

総合スコア9796

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問