前提・実現したいこと
Debug.LogをTextでゲーム画面にも表示するUIを作っています。
このUIはシーン遷移しても破棄されないようにしているのですが、シーン遷移する度にエラーが出てしまいその解決方法がわからず困っています。
発生している問題・エラーメッセージ
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.
シーン遷移して別のシーンに移った後、最初にこのUIが配置されていたシーンにまた戻ってくると、上記のエラーが出ます。
該当のソースコード
シーン遷移しても破棄されないようにする処理のコードは、Canvasにアタッチしています。
Debug.LogをTextに表示するための処理のコードは、Canvasの子のScrollViewにアタッチしています。
Canvas
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DontDestroyOnLoad : MonoBehaviour 6{ 7 public static DontDestroyOnLoad Instance 8 { 9 get; private set; 10 } 11 12 void Awake() 13 { 14 if(Instance != null) 15 { 16 Destroy(gameObject); 17 return; 18 } 19 Instance = this; 20 Debug.Log(Instance); 21 22 DontDestroyOnLoad(gameObject); 23 } 24} 25
UIObj
1using UnityEngine; 2using UnityEngine.UI; 3 4public class LogMenu : MonoBehaviour 5{ 6 private Text m_textUI; 7 8 private void Awake() 9 { 10 //ログメッセージが出力された時に呼ばれる関数のデリゲート 11 Application.logMessageReceived += OnLogMessage; 12 m_textUI = GetComponent<Text>(); 13 } 14 15 private void OnDestroy() 16 { 17 Application.logMessageReceived += OnLogMessage; 18 } 19 20 private void OnLogMessage(string i_logText, string i_stackTrace, LogType i_type) 21 { 22 if (string.IsNullOrEmpty(i_logText)) 23 { 24 return; 25 } 26 27 if (!string.IsNullOrEmpty(i_stackTrace)) 28 { 29 switch (i_type) 30 { 31 case LogType.Error: 32 case LogType.Assert: 33 case LogType.Exception: 34 i_logText += System.Environment.NewLine + i_stackTrace; 35 break; 36 default: 37 break; 38 } 39 } 40 41 switch (i_type) 42 { 43 case LogType.Error: 44 case LogType.Assert: 45 case LogType.Exception: 46 i_logText = string.Format("<color=red>{0}</color>", i_logText); 47 break; 48 case LogType.Warning: 49 i_logText = string.Format("<color=yellow>{0}</color>", i_logText); 50 break; 51 default: 52 break; 53 } 54 55 bool same = m_textUI.text.Contains(i_logText); 56 57 if(!same) m_textUI.text += i_logText + System.Environment.NewLine; 58 } 59} // class LogMenu
試したこと
シーン遷移しても破棄されないようにする処理は、シーンがロードされてObjがインスタンス化される時に、前のインスタンスを消滅させることでObjが重複するのを防いでいます。
なので、前のObjが消されて新しいインスタンスに切り替わった時に、GetComponent<Text>()をすれば破棄されたTextにはアクセスしなくなるかなと思ってやってみましたが、変わらず同じエラーが出て解決できませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/05 09:27