将MP3加载到音频阵列并将其分配给GameObject阵列的成员

时间:2014-02-19 05:52:58

标签: c# audio unity3d

我正在尝试从Resources文件夹中加载一系列MP3文件,然后将每个MP3文件分配给GameObject的Audio Clip值。

此GameObjects列表(称为“Notes”)已排序,MP3文件已经手动排序(其名称按数字顺序排列)。

下面是我的尝试,我已经删除了排序方法SortNotes()以节省空间(它工作得很好,不是问题)。

// An array of Notes
public GameObject[] NotesArray;

AudioClip[] pickupMP3s;

// Use this for initialization
void Start () {
    // Grab and sort array of Notes
    NotesArray = GameObject.FindGameObjectsWithTag("Note");
    SortNotes();

    // Grab a list of pick-up mp3 files
    pickupMP3s = Resources.LoadAll("..\\Level 4\\Level 4 Pickup Tracks") as AudioClip[];
}

// Assign each mp3 file to a Note
void AssignNotes(){
    for (int i = 0; i < NotesArray.Length; i++){
        foreach (GameObject note in NotesArray){
            try{
                note.audio.clip = pickupMP3s[i];
                Debug.Log(pickupMP3s[i]);
                Debug.Log(note.audio.clip.name);
            }catch(Exception e){
                Debug.Log(e.ToString());
            }
        }
    }   
}

我得到了大量的NullReferenceException:对象引用未设置为对象错误的实例。它们似乎源于这一行:note.audio.clip = pickupMP3s [i];但我无法弄清楚是什么。

对象已经附加了音频源。

2 个答案:

答案 0 :(得分:1)

NotesArray和pickupMP3s的长度是否相同?我会在你的for循环中做一个断点,看看异常何时发生。当它发生时,检查你是否超出了pickupMP3s数组的索引范围。

另一个错误可能是您的note.audio对象未实例化,因此当您尝试设置其clip属性时,它会抛出错误。通过设置断点来使用调试器可以让您知道哪个对象为空。我不确定上面的代码,但我会假设你有一个音频对象作为其属性之一,具有剪辑属性。您没有显示任何显示note.audio是否被实例化(甚至是注释)的代码,因此很难说。确保你实例化所有这些。

答案 1 :(得分:1)

Resolved here.

问题是pickupMP3s赋值的类型转换。应该是:

pickupMP3s = Resources.LoadAll<AudioClip>("Level4/Level4_Pickup_Tracks"); 

另外麻烦的线应该是

NotesArray[i].audio.clip = pickupMP3s[i]; 

而不是

note.audio.clip - pickupMP3s[i];