質問: progressVal; yield return null; } } } ``` ### 試したこと 半日調べて、 ・デストロイ(削除)したのにアクセスし続けている ・なので、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に含まれませんと言っているのは分かるのですが、 なぜ含まれないのか?がわかりません。
回答: 解決方法 ==== ``` エラーで指摘されていた箇所は、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代入でも実現できます) 私はまだ駆け出しなのでこのようなやり方しか思いつきませんが、 皆さんの助けになれれば幸いです。 ``` ``` using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Loading : MonoBehaviour { // 非同期動作で使用するAsyncOperation private AsyncOperation async; // シーンロード中に表示するUI画面 [SerializeField] private GameObject loadUI; // 読み込み率を表示するスライダー [SerializeField] private Slider slider; int Start = 0; private void Awake() { DontDestroyOnLoad(this); if (Start == 0) loadUI.SetActive(true); else loadUI.SetActive(false); Start++; // コルーチンを開始 StartCoroutine("LoadData"); } IEnumerator LoadData() { // シーンの読み込みをする async = SceneManager.LoadSceneAsync("TestScene"); // 読み込みが終わるまで進捗状況をスライダーの値に反映させる while (!async.isDone) { var progressVal = Mathf.Clamp01(async.progress / 0.9f); slider.value = progressVal; yield return null; } } } ```