Словарь<строка, AudioSource>.Add() возникает ошибка, потому что инициализируется напрямую
Я новичок в C# и Unity. Я хочу сделать аудио менеджер со словарем. Но возникает ошибка "NullReferenceException" с выдутым кодом.
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 ответ
Я не смог воспроизвести вышеупомянутое поведение с тестом 2017.1.1f1 Editor. Я вставил mp3-файл в файл Assets/Resources/test.mp3. Затем я создал пустой GameObject с тестовым скриптом:
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 не был нулевым, и test.mp3 был добавлен в AudioDictionary.