播放从资源文件夹中获取的AudioClip

时间:2019-09-19 09:31:37

标签: c# unity3d

我需要获取resources文件夹中的audioClip,以便据我所知我需要使用Resources.Load<AudioClip>(path)Resources.Load(path) as AudioClip,但这是行不通的,它甚至不返回null而是停止代码

我的代码示例:

private void FetchAudioClipAndStartPlay(int userPos, int index)
{


    AudioClip clip = Resources.Load($"Audio/Demo_ENG/D{userPos}a") as AudioClip;
    Debug.Log("Starting Coroutine " + index);
    StartCoroutine(PlayAudioClipAndStartRetrievingFromDatabase(index, clip));
}

IEnumerator PlayAudioClipAndStartRetrievingFromDatabase(int index, AudioClip clip)
{
    Debug.Log("Starting to play " + index);
    audioSource.PlayOneShot(clip, 1f);
    yield return new WaitForSeconds(clip.length);

    if (index < numberOfPlayers)
    {
        RetrieveFromDatabase(index++);
    }
}

(它不会进入协程)

enter image description here

enter image description here

所有音频文件均为.mp3

非常感谢任何指导和提示!

1 个答案:

答案 0 :(得分:2)

  1. Unity不支持在运行时加载mp3。
  2. 团结does not recommend using the Resources folder
  

请勿使用。
  提出此强烈建议的原因有几个:

     
      
  • 使用Resources文件夹可以更精细地进行内存管理   困难资源文件夹使用不当会增加应用程序   启动时间和构建时间
  •   
  • 作为资源数量   文件夹增加,这些文件夹内资产的管理   变得非常困难
  •   
  • 资源系统会降低项目的   向特定平台交付自定义内容的能力,以及   消除了增量内容升级的可能性   AssetBundle Variants是Unity调整内容的主要工具   每个设备上
  •   

检查this answer,了解如何加载音频文件的解决方案:

public void LoadSong()
{
    StartCoroutine(LoadSongCoroutine());    
}

IEnumerator LoadSongCoroutine()
{
    string url = string.Format("file://{0}", path); 
    WWW www = new WWW(url);
    yield return www;

    song.clip = www.GetAudioClip(false, false);
    songName =  song.clip.name;
    length = song.clip.length;
}