前提・実現したいこと
MusicMangerという、音楽関係のプログラムをまとめたオブジェクトをつくりました。
ほかのシーンでも使いまわそうと考えているため、シーン遷移時デストロイしないようにしました。
最初のシーンでは音量設定などができるスライダなどが存在しているのですが、当然
シーン遷移するとすらいだは消し去ります。そうするとConsoleにずっとエラーが出てしまうので困っています。
発生している問題・エラーメッセージ
MissingReferenceException: The object of type 'Slider' 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.Component.GetComponent[T] () (at <d815b7efac424eeb8e053965cccb1f98>:0) MusicManeger.Update () (at Assets/Script/MusicManeger.cs:24)
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class MusicManeger : MonoBehaviour 7{ 8 public AudioClip[] audio_clip; 9 public AudioClip[] bgm_clip; 10 public AudioSource bgm_speaker; 11 public AudioSource se_speaker; 12 string nextname; 13 public int Fade; 14 public Slider m_slider; 15 16 private void Awake() 17 { 18 DontDestroyOnLoad(this); 19 m_slider.GetComponent<Slider>().normalizedValue = PlayerPrefs.GetFloat("volume", 1f); 20 } 21 22 void Update() 23 { 24 bgm_speaker.volume = m_slider.GetComponent<Slider>().normalizedValue; 25 se_speaker.volume = m_slider.GetComponent<Slider>().normalizedValue; 26 } 27 28 public void PlayBgm(string bgmname) 29 { 30 Debug.Log(bgmname); 31 int _selectedIndex = -1; 32 int i; 33 34 for (i = 0; i < bgm_clip.Length; i++) 35 { 36 37 // Contains なので含めばヒットする。Equalsにすれば完全に等しいものだけ 38 if (bgm_clip[i].name.Contains(bgmname)) 39 { 40 _selectedIndex = i; 41 break; 42 } 43 } 44 Debug.Log(_selectedIndex); 45 bgm_speaker.loop = true; 46 bgm_speaker.clip = bgm_clip[i]; 47 bgm_speaker.Play(); 48 49 } 50 51 public void PlaySE(string sename) 52 { 53 Debug.Log(sename); 54 int _selectedIndex = -1; 55 int i; 56 57 for (i = 0; i < audio_clip.Length; i++) //オーディオクリップの長さより長く続かないように 58 { 59 60 // Contains なので含めばヒットする。Equalsにすれば完全に等しいものだけ 61 if (audio_clip[i].name.Equals(sename)) 62 { 63 _selectedIndex = i; 64 break; 65 } 66 } 67 Debug.Log(_selectedIndex); 68 se_speaker.loop = false; 69 se_speaker.clip = audio_clip[i]; 70 se_speaker.Play(); 71 72 } 73 74 public void StopBgm(string next) 75 { 76 StartCoroutine("Fadeout"); //fadeoutコルーチンを発動 77 nextname = next; 78 } 79 80 IEnumerator nextprepare() 81 { 82 yield return new WaitForSeconds(0.3f); 83 84 PlayBgm(nextname); 85 } 86 87 IEnumerator Fadeout() 88 { 89 for (; Fade > 0; Fade--) 90 { 91 bgm_speaker.volume = (float)Fade / 100; 92 yield return null; 93 } 94 bgm_speaker.Stop(); 95 Debug.Log("stoped"); 96 bgm_speaker.volume = 1; 97 98 StartCoroutine("nextprepare"); 99 } 100 101 public void savedvolume() 102 { 103 PlayerPrefs.SetFloat("volume", bgm_speaker.volume); 104 PlayerPrefs.Save(); 105 } 106}
試したこと
調べたらtry構文を使うとよいと書いてありましたが、宣言しているのはAwakeで最初だし、
まず何を例外として引数に入力するのかわかりませんでした。
Nullの時?
このプログラムでの対処法がわかりませんでした。
void Update() { try //例外処理を受け流す { bgm_speaker.volume = m_slider.GetComponent<Slider>().normalizedValue; se_speaker.volume = m_slider.GetComponent<Slider>().normalizedValue; } catch (MissingReferenceException) //発生するであろうエラー名 { Debug.Log("Null slider"); } }
こうすることでエラーは出なくなりましたが、ずーっと呼び出され続けて肝心なログを見れません。
ずーっとなるのを止めたいです。
補足情報(FW/ツールのバージョンなど)
unity 2019 3.7f1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/06 06:28
2021/01/07 00:31
2021/01/17 14:44