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

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

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

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

Unity

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

Q&A

解決済

1回答

2828閲覧

Unity【NowLoading】画面開発時にMissing Reference Exceptionのエラーが出る

gotoken_yuutyan

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2019/12/25 06:42

前提・実現したいこと

現在、UnityにてSceneをロードしたら
NowLoading(ゲームによくある奴)が始まるシーンを作成しております。
一応、下記のソースでシーン自体は動くのですが
実行し終わった後に、エラーが出ます。

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

MissngReferenceException:The object of type 'GameObject has been destroyed but you still trying to access it.

該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using UnityEngine.SceneManagement; 5 6public class Loading : MonoBehaviour 7{ 8 9// 非同期動作で使用するAsyncOperation 10private AsyncOperation async; 11// シーンロード中に表示するUI画面 12[SerializeField] 13private GameObject loadUI; 14// 読み込み率を表示するスライダー 15[SerializeField] 16private Slider slider; 17 18private void Awake() 19{ 20SceneManager.sceneLoaded += OnSceneLoaded;//イベントにメソッドを登録 21DontDestroyOnLoad(this.loadUI); 22} 23 24void OnSceneLoaded(Scene Loading, LoadSceneMode sceneMode) 25{ 26// ロード画面UIをアクティブにする 27loadUI.SetActive(true); 28 29// コルーチンを開始 30StartCoroutine("LoadData"); 31} 32 33 34IEnumerator LoadData() 35{ 36// シーンの読み込みをする 37async = SceneManager.LoadSceneAsync("TestScene"); 38 39// 読み込みが終わるまで進捗状況をスライダーの値に反映させる 40while (!async.isDone) 41{ 42var progressVal = Mathf.Clamp01(async.progress / 0.9f); 43slider.value = progressVal; 44yield return null; 45} 46} 47} 48

試したこと

半日調べて、
・デストロイ(削除)したのにアクセスし続けている
・なので、nullかDontDestroy(消さない)処理を追加する必要がある。
・しかし、DontDestroyだけだとobjが増え続ける。
ということがわかりました。

しかし、エラーで指摘されている
private GameObject loadUIは、
・boolean型でnullは入れることができない
・かといってDestroy処理のifを3つほどサイトを参考にして書いてみたが
エラーを吐いてうまくいかず...

以上の点で躓いていました。

お手数おかけしますが、皆さんの知恵をお借りしたいです。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Unity 2019.2.11f

DontDestrouを追記するべく
GameObject.DontDestroy(loadUI);と記述すると
'GameObject' does not contain a definition for 'DontDestroy'とエラーが出ます。

ゲームオブジェクトがDontDestroyに含まれませんと言っているのは分かるのですが、
なぜ含まれないのか?がわかりません。

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

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

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

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

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

sakura_hana

2019/12/25 07:55

質問内のエラーメッセージが途中で切れていませんか? また、どのスクリプトのどの行でエラーが発生しているかがこのメッセージの後に続いているはずなので確認してください。 とりあえずloadUIはGameObject型なので「boolean型でnullは入れることができない」というのは意味が分かりません。 更に「'GameObject' does not contain a definition for 'DontDestroy'」は『「GameObject」には「DontDestroy」の定義が含まれていません』なので認識が逆です。 それも当然で、DontDestroyというメソッドは存在せず、あるのは「DontDestroyOnLoad」です。 https://docs.unity3d.com/ja/current/ScriptReference/Object.DontDestroyOnLoad.html 各メソッド・変数がどういう意味なのか確認しながらコードを書き、それでも駄目ならどこでどんなエラーが起こったか明記してください。(「うまくいかない」では分かりません)
gotoken_yuutyan

2019/12/26 07:35

回答・ご指摘ありがとうございます。 スクリプトリファレンスを確認しながらコードを記述し直したら きちんと動作しました。 最後の2行(各メソッド...分かりません))は、 今後質問していくうえで十分気を付けます。 もし、これが開発環境の職場で「うまくいかない」だけ言っていたら 上司に怒鳴られているかもしれません。 怒鳴られる前に、自分のいい加減さに気づけて本当に良かったです。 ありがとうございました!
sakura_hana

2019/12/26 10:51

解決して何よりです。 同じ問題を持ってこのページを見た人達の為に自己回答して質問をクローズしてください。
guest

回答1

0

自己解決

解決方法

エラーで指摘されていた箇所は、DontDestroyOnLoad(this.loadUI);でした。 出たエラーが 1つめ:MissngReferenceException:The object of type 'GameObject has been destroyed but you still trying to access it. 2つめ:リファレンスにDontDestroyなんて存在しないよ? というエラーでした。 なので、直した点は DontDestroyOnLoad(this.loadUI); → DontDestroyOnLoad(this); へ。 そして、そもそも処理を一度できれば良かったので void OnSceneLoadedメソッドが要らないことに気づき削除し、 メソッドの中にあったものをAwakeメソッドの中へ移動。 最後に、1つめのエラーからわかりますが、LoadUI.SetActive(true)である限り 毎フレームコルーチンを呼び出してしまうので、一度呼び出したら二度と呼び出さないようにしたい。 これをint型のStart変数を用いて実現しました。 (int型でなくてもbool型でtrue→false代入でも実現できます) 私はまだ駆け出しなのでこのようなやり方しか思いつきませんが、 皆さんの助けになれれば幸いです。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using UnityEngine.SceneManagement; 5 6public class Loading : MonoBehaviour 7{ 8 9 // 非同期動作で使用するAsyncOperation 10 private AsyncOperation async; 11 // シーンロード中に表示するUI画面 12 [SerializeField] 13 private GameObject loadUI; 14 // 読み込み率を表示するスライダー 15 [SerializeField] 16 private Slider slider; 17 18 int Start = 0; 19 20 private void Awake() 21 { 22 DontDestroyOnLoad(this); 23 24 if (Start == 0) 25 loadUI.SetActive(true); 26 else 27 loadUI.SetActive(false); 28 29 Start++; 30 31 // コルーチンを開始 32 StartCoroutine("LoadData"); 33 } 34 35 36 IEnumerator LoadData() 37 { 38 // シーンの読み込みをする 39 async = SceneManager.LoadSceneAsync("TestScene"); 40 41 // 読み込みが終わるまで進捗状況をスライダーの値に反映させる 42 while (!async.isDone) 43 { 44 var progressVal = Mathf.Clamp01(async.progress / 0.9f); 45 slider.value = progressVal; 46 yield return null; 47 } 48 } 49}

投稿2019/12/26 11:55

編集2019/12/26 11:58
gotoken_yuutyan

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問