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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

1358閲覧

unityのMissingReferenceExceptionについて

709

総合スコア28

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2019/04/09 11:46

#エラー
玉ころがしゲームで一回のゲームが終わった後リトライのボタンを押してシーンを読み直すとスコアを表示するスクリプトでエラーが起きていましたどこを直せばいいのでしょうか?

error

1MissingReferenceException: The object of type 'Text' has been destroyed but you are still trying to access it. 2Your script should either check if it is null or you should not destroy the object. 3UnityEngine.EventSystems.UIBehaviour.IsActive () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/UIBehaviour.cs:28) 4UnityEngine.UI.Graphic.SetVerticesDirty () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:223) 5UnityEngine.UI.Text.set_text (System.String value) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Text.cs:213) 6ScoreTxt.OnAddScore (System.Int32 score) (at Assets/script/ScoreTxt.cs:27) 7DataManager.AddScore (System.Int32 addScore) (at Assets/script/DataManager.cs:45) 8item.OnTriggerEnter (UnityEngine.Collider hit) (at Assets/script/item.cs:48)

##ScoreTxt.cs

C#

1using UnityEngine; 2using UnityEngine.UI; 3 4public class ScoreTxt : MonoBehaviour 5{ 6 /// <summary> 7 /// テキストを設定 8 /// </summary> 9 [SerializeField] Text TxtRender; 10 11 void Start() 12 { 13 //初期スコアを設定 14 OnAddScore(DataManager.Instance.Score); 15 16 // スコア追加イベントを受け取る 17 DataManager.Instance.OnAddScore += OnAddScore; 18 19 } 20 21 /// <summary> 22 /// スコアがカウントされると呼ばれる 23 /// </summary> 24 /// <param name="score">Score.</param> 25 void OnAddScore(int score) 26 { 27 TxtRender.text = score.ToString(); 28 } 29}

##GameResult.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using UnityEngine.UI; 6 7public class GameResult : MonoBehaviour 8{ 9 private int highScore; 10 public static bool Result; 11 public Text resultScoreText; 12 public Text resultText; 13 public Text bestScoreText; 14 public GameObject resultUI; 15 // Start is called before the first frame update 16 void Start() 17 { 18 Result=false; 19 if (PlayerPrefs.HasKey("HighScore")) 20 { 21 highScore=PlayerPrefs.GetInt("HighScore"); 22 }else 23 { 24 highScore=0; 25 } 26 27 } 28 29 // Update is called once per frame 30 void Update() 31 { 32 if (Timer.nowtime==0f) 33 { 34 Result=true; 35 resultUI.SetActive(true); 36 int result= Mathf.FloorToInt(DataManager.Instance.Score); 37 resultScoreText.text="ResultScore:"+result; 38 bestScoreText.text="BestScore:"+highScore; 39 if (highScore<result) 40 { 41 resultText.text="HighScore!!"; 42 PlayerPrefs.SetInt("HighScore",result); 43 } 44 } 45 } 46 public void OnRetry(){ 47 DataManager.Instance.resetScore(); 48 SceneManager.LoadScene("Stage1"); 49 } 50 public void BackTitle(){ 51 SceneManager.LoadScene ("Title"); 52 } 53 54} 55

##DataManager.cs

C#

1using System; 2using UnityEngine; 3 4public class DataManager : MonoBehaviour 5{ 6 //シングルトン化 DataManager.Instanceで何処からでもアクセスできます。 7 public static DataManager Instance 8 { 9 get{ 10 if (_instance == null) 11 { 12 _instance = LoadInstance(); 13 } 14 return _instance; 15 } 16 } 17 static DataManager _instance; 18 19 /// <summary> 20 /// スコアが追加されたのを通知 21 /// </summary> 22 public event Action<int> OnAddScore = delegate {}; 23 24 /// <summary> 25 /// 現在のスコア 26 /// </summary> 27 /// <value>The score.</value> 28 public int Score{ get; private set; } 29 30 void Awake() 31 { 32 if(_instance != null 33 && _instance != this) 34 { 35 Destroy(gameObject); 36 } 37 } 38 39 public void AddScore(int addScore) 40 { 41 if (!GameResult.Result) 42 { 43 Score += addScore; 44 //通知 45 OnAddScore(Score); 46 } 47 //スコアを加算 48 49 } 50 public void resetScore() 51 { 52 if (!GameResult.Result) 53 { 54 Score = 0; 55 //通知 56 57 } 58 //スコアを加算 59 60 } 61 62 /// <summary> 63 /// インスタンスの設定 64 /// </summary> 65 public static DataManager LoadInstance() 66 { 67 var instance = FindObjectOfType<DataManager>(); 68 69 if(instance == null) 70 { 71 var go = new GameObject("DataManager", new []{typeof(DataManager) }); 72 instance = go.GetComponent<DataManager>(); 73 } 74 75 DontDestroyOnLoad(instance.gameObject); 76 return instance; 77 } 78}

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

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

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

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

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

guest

回答3

0

自己解決

DataManager.csのDontDestroyOnLoad(instance.gameObject);をけしたら治りました。

投稿2019/04/26 13:09

709

総合スコア28

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

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

709

2019/04/26 13:10

回答してくれた皆様ありがとうございました。
guest

0

引用テキスト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.

直訳「'Text'型のオブジェクトは破壊されましたが、まだアクセスしようとしています。
あなたのスクリプトはそれがnullであるかどうかをチェックするべきであるか、あなたはオブジェクトを破壊するべきではありません。」

と書かれています。GameResult.csを見た感じですと、BackTitleの処理が走った後にもう一度Updateを読んでいる気がします。bool型のフラグ又は現在のシーンを判定する関数でも使って処理を切ればいけそうな気がします。

引き続きゲーム制作頑張って下さい。

投稿2019/04/23 00:47

stdio

総合スコア3307

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

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

0

DataManagerが破棄されないオブジェクトで、ScoreTxtはシーン繊維で破棄されるオブジェクトなのだと想定して、DataManager.Instance.OnAddScore += OnAddScore;で登録したものがScoreTxtが破棄されたときに解除されていないからだと思います。

投稿2019/04/09 13:40

vo3

総合スコア321

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

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

709

2019/04/10 09:50

どうやったら解除できますか?(初心者ですいません)
vo3

2019/04/10 13:19

タイミングやその他の実装によっては別の不具合を生むかもしれませんが、ScoreTxtにOnDestroyかOnDisableを定義して、その中でDataManager.Instance.OnAddScore -= OnAddScore;を実装してみてください。 OnDisable、OnDestroyなどのイベント関数がわからないのであれば、一度公式のリファレンスを確認してみるといいです。 https://docs.unity3d.com/jp/current/Manual/ExecutionOrder.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問