所有。我是一個初級的C#和unity.I想用字典做一個音頻管理器。但它發生錯誤「NullReferenceException」與吹碼。字典<string,AudioSource> .Add()發生錯誤,因爲直接初始化
public Dictionary<string, AudioSource> AudioDictionary = new Dictionary<string, AudioSource>() ;
private List<AudioSource> resAudioSource = new List<AudioSource>();
private const string ResourcePath = "Audio/";
private void Awake()
{
#region instance
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
#endregion
AudioClip[] resAudio = Resources.LoadAll<AudioClip>(ResourcePath);
AudioSource temp;
for (int audioNum = 0; audioNum < resAudio.Length; audioNum++)
{
temp = gameObject.AddComponent<AudioSource>();
Debug.Log(resAudio[audioNum].name);
AudioDictionary.Add(resAudio[audioNum].name, temp);
}
}
這樣改變後就可以了。
public Dictionary<string, AudioSource> AudioDictionary;
private List<AudioSource> resAudioSource = new List<AudioSource>();
private const string ResourcePath = "Audio/";
private void Awake()
{
#region instance
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
#endregion
AudioDictionary = new Dictionary<string, AudioSource>();//the change
AudioClip[] resAudio = Resources.LoadAll<AudioClip>(ResourcePath);
AudioSource temp;
for (int audioNum = 0; audioNum < resAudio.Length; audioNum++)
{
temp = gameObject.AddComponent<AudioSource>();
Debug.Log(resAudio[audioNum].name);
AudioDictionary.Add(resAudio[audioNum].name, temp);
}
}
我很困惑爲什麼我不能直接初始化字典,任何人都可以解釋它?
'AudioDictionary'是一個公共字段,因此有可能在調用'Awake()'方法時,其他代碼將其設置爲null或清除它。查看訪問它的內容以及它對字典的作用。 – CodingYoshi
使用[this(過度使用)線程](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix-it)作爲一個副本到這個isn' t非常有幫助。 OP已經知道哪一行導致錯誤。問題是,爲什麼OP必須初始化'Awake'的字典_inside_而不是外部?它看起來像我的第一個代碼片段應該工作,但也許一個Unity專家可以權衡... –
@GrantWinney我同意你的看法。該帖子被濫用。到ZJN,你的Unity版本是什麼?哪一行代碼在第一個代碼中出現錯誤? – Programmer