前提・実現したいこと
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
あなたの回答
tips
プレビュー