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

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

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

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

Q&A

0回答

1194閲覧

Unityで実行を止めると"MissingReferenceException"が発生してしまう件

gratan

総合スコア6

Unity

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

1グッド

0クリップ

投稿2020/03/13 21:04

前提・実現したいこと

unityでターゲットとなるオブジェクトを破壊すると、残りターゲット数を示すテキストを切り替えるシステムを実装しています。
ターゲットを破壊するとtargetScriptのOnDestroy()で別オブジェクトにアタッチされているスクリプトのchangetargetText()が呼び出されます。

実行中は問題なく起動し、テキストの切り替えも問題なく行われます。
しかし、実行を終了すると、下記のエラーが発生してしまいます。
ターゲットは全部で9つあるのですが、実行を止めた時点で破壊されていないターゲットの数だけエラーが発生するようです。(全てのターゲットを破壊してから実行を止めるとエラーは出ません)

実行を止めるとtextが破棄され、そこにアクセスしようとしているのでしょうか?
以前はこのようなエラーは出ていなかったのですが、急に出るようになってしまいました。
原因も対処法もわからず困っています。
恐れ入りますが、ご教授お願いいたします。

発生している問題・エラーメッセージ

MissingReferenceException: The object of type 'Text' 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. UnityEngine.EventSystems.UIBehaviour.IsActive () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/UIBehaviour.cs:28) UnityEngine.UI.Graphic.SetVerticesDirty () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:223) UnityEngine.UI.Text.set_text (System.String value) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Text.cs:213) gameControllerScript.changeTargetText () (at Assets/Scripts/gameControllerScript.cs:47) targetScript.OnDestroy () (at Assets/Scripts/targetScript.cs:23)

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class targetScript : MonoBehaviour 7{ 8 //残りターゲット 9 private GameObject GameController; 10 private gameControllerScript _gameControllerScript; 11 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 GameController = GameObject.Find("GameController"); 17 _gameControllerScript = GameController.GetComponent<gameControllerScript>(); 18 } 19 20 21 22 private void OnDestroy() 23 { 24 _gameControllerScript.changeTargetText(); // 23行目 25 } 26}

C#

1public class gameControllerScript : MonoBehaviour 2{ 3 //経過時間 4 [SerializeField]private GameObject time; 5 private Text time_text; 6 private float ElapseTime; 7 8 //残りターゲット 9 [SerializeField]private GameObject remainingTarget; 10 private Text target_text; 11 private int target_num = 9; 12 13 //リザルト画面 14 [SerializeField]private GameObject resultPanel; 15 [SerializeField]private Text result_text; 16 [SerializeField]private GameObject tipsPanel; 17 18 //シーン再読み込み 19 private Scene loadScene; 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 time_text = time.GetComponent<Text>(); 25 target_text = remainingTarget.GetComponent<Text>(); 26 loadScene = SceneManager.GetActiveScene(); 27 } 28 29 void Update() 30 { 31 ElapseTime += Time.deltaTime; 32 time_text.text = "Time : " + (ElapseTime).ToString("F1"); 33 } 34 35 public void changeTargetText() 36 { 37 38 target_num -= 1; 39 target_text.text = "target : " + (target_num).ToString(); 40 if (target_num <= 0) 41 {//47行目 42 GameComplete(); 43 } 44 } 45public void GameComplete() 46 { 47 float resultTime = ElapseTime; 48 49 time.SetActive(false); 50 remainingTarget.SetActive(false); 51 52 resultPanel.SetActive(true); 53 result_text.text = "YourTime : " + (resultTime).ToString("F1") + "s"; 54 tipsPanel.SetActive(false); 55 56 57 Time.timeScale = 0; 58 59 } 60 61 public void pushRetryButtom() 62 { 63 SceneManager.LoadScene(loadScene.name); 64 Time.timeScale = 1; 65 } 66}

試したこと

Unityの再起動

環境

macOS Catalina (10.15)
Unity 2018.3.11

s.k👍を押しています

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

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

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

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

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

izmktr

2020/03/14 15:59

if (result_text != null) result_text.text = ... としてみたらどうなりますか?
gratan

2020/06/04 21:25

申し訳ありません、返信と回答したつもりだったんですができていなかったようで、今更気付きました… いただいた通りに条件で弾けばエラーは出なくなりました。 難しく考えすぎて初歩的な解決策に気づけませんでした。ありがとうございます。 改めて、ご教授いただいたのに返信遅くなってしまって申し訳ありませんでした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問