将 MP3 加载到音频阵列中并将它们分配给游戏对象数组的成员



我正在尝试从资源文件夹加载 MP3 文件数组,然后将每个 MP3 文件分配给游戏对象的音频剪辑值。

此游戏对象列表(称为"注释")已排序,并且 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];但我不知道是什么。

对象已附加音频源。

NotesArray 和 pickupMP3 的长度是一样的吗? 我会在你的 for 循环上做一个断点,看看什么时候发生异常。 发生这种情况时,请检查您是否超出了 pickupMP3s 数组的索引范围。

另一个错误可能是您的 note.audio 对象未实例化,因此当您尝试设置其 clip 属性时,它会引发错误。通过设置断点来执行调试器将让您知道哪个对象为 null。 我不确定上面的代码,但我想你有一个音符对象,它有一个音频对象作为其属性之一,它有一个 clip 属性。您没有显示任何显示 note.audio 是否正在实例化(甚至注释)的代码,因此很难说。 确保实例化所有这些。

在这里解决。

问题是拾音MP3分配的类型转换。它应该是:

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

此外,麻烦的线路应该是

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

而不是

note.audio.clip - pickupMP3s[i];

最新更新