all.Ich bin ein Anfänger von C# und unity.Ich möchte einen Audio-Manager mit dem Wörterbuch zu machen.Aber es tritt ein Fehler "NullReferenceException" mit blies Code.Dictionary <string, AudioSource> .Add() auftreten Fehler, weil direkt initialisiert
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);
}
}
Und es ist OK nach Änderung wie folgt.
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);
}
}
Ich bin sehr verwirrt, warum ich das Wörterbuch nicht direkt initialisieren kann, kann jeder es erklären?
'AudioDictionary' ist ein öffentliches Feld, daher ist es möglich, dass die Methode 'Awake()' aufgerufen wird, wenn ein anderer Code sie auf null setzt oder löscht. Sehen Sie, was darauf zugreift und was es für Ihr Wörterbuch tut. – CodingYoshi
Mit [dieses (überbenutzte) Thread] (https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-fix-it) als ein Duplikat zu diesem isn ' t sehr hilfreich. Das OP weiß bereits, welche Zeile den Fehler verursacht. Die Frage ist, warum muss das OP das Wörterbuch _inside_ von'Awake' anstatt von außen initialisieren? Es sieht für mich so aus, als ob das erste Code-Snippet funktionieren sollte, aber vielleicht könnte ein Unity-Experte ... –
@GrantWinney Ich stimme dir zu. Dieser Beitrag wird überstrapaziert. An ZJN, Was ist deine Unity-Version? Und mit welcher Codezeile erhalten Sie diesen Fehler mit dem ersten Code? – Programmer