2017-11-04 43 views
0

所有。我是一個初級的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); 
    } 
} 

我很困惑爲什麼我不能直接初始化字典,任何人都可以解釋它?

+1

'AudioDictionary'是一個公共字段,因此有可能在調用'Awake()'方法時,其他代碼將其設置爲null或清除它。查看訪問它的內容以及它對字典的作用。 – CodingYoshi

+1

使用[this(過度使用)線程](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix-it)作爲一個副本到這個isn' t非常有幫助。 OP已經知道哪一行導致錯誤。問題是,爲什麼OP必須初始化'Awake'的字典_inside_而不是外部?它看起來像我的第一個代碼片段應該工作,但也許一個Unity專家可以權衡... –

+1

@GrantWinney我同意你的看法。該帖子被濫用。到ZJN,你的Unity版本是什麼?哪一行代碼在第一個代碼中出現錯誤? – Programmer

回答

0

我無法用2017.1.1f1編輯器測試重現上述行爲。我在Assets/Resources/test.mp3文件中插入mp3文件。然後,我創建了測試腳本的遊戲對象空:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Test : MonoBehaviour { 

public Dictionary<string, AudioSource> AudioDictionary = new Dictionary<string, AudioSource>() ; 
private List<AudioSource> resAudioSource = new List<AudioSource>(); 
private const string ResourcePath = "Audio/"; 

public static Test instance; 

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); 
    } 
} 
} 

當插入斷點到for循環中,我看得出來,AudioDictionary是不是null,請將test.mp3加入到AudioDictionary。

+0

感謝您的支持。與我上面所說的一樣,由於Odin-inspector插件可能會發生錯誤。 @CodingYoshi他說的話可能是對的。 – ZJN

相關問題