我正在尝试从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];但我无法弄清楚是什么。
对象已经附加了音频源。
答案 0 :(得分:1)
NotesArray和pickupMP3s的长度是否相同?我会在你的for循环中做一个断点,看看异常何时发生。当它发生时,检查你是否超出了pickupMP3s数组的索引范围。
另一个错误可能是您的note.audio对象未实例化,因此当您尝试设置其clip属性时,它会抛出错误。通过设置断点来使用调试器可以让您知道哪个对象为空。我不确定上面的代码,但我会假设你有一个音频对象作为其属性之一,具有剪辑属性。您没有显示任何显示note.audio是否被实例化(甚至是注释)的代码,因此很难说。确保你实例化所有这些。
答案 1 :(得分:1)
问题是pickupMP3s赋值的类型转换。应该是:
pickupMP3s = Resources.LoadAll<AudioClip>("Level4/Level4_Pickup_Tracks");
另外麻烦的线应该是
NotesArray[i].audio.clip = pickupMP3s[i];
而不是
note.audio.clip - pickupMP3s[i];