Словарь<строка, 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.

Другие вопросы по тегам