Unity在MacOS下使用www.SendWebRequest()无法加载StreamingAssets音频
问题解决:MacOS下Unity加载StreamingAssets音频失败
问题描述
开发面向Windows平台的Unity应用,音频文件存放在StreamingAssets目录方便用户自定义替换。Windows平台下以下代码可正常将音频加载至AudioSource,但在MacOS开发环境中,File.Exists返回true,却触发UnityWebRequest错误,提示Cannot connect to destination host(无法连接到目标主机)。
原代码:
void SetAudioFromStreamingAssets() { if (string.IsNullOrEmpty(StreamingAssetFilePath)) return; string fullpath = Application.streamingAssetsPath + "/" + StreamingAssetFilePath; if (!File.Exists(fullpath)) return; StartCoroutine(SetAudioClipFromFile(source,fullpath)); } IEnumerator SetAudioClipFromFile(AudioSource audioSource, string path) { using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, AudioType.UNKNOWN)) { yield return www.SendWebRequest(); if (www.isNetworkError) { VisDebug.AppendTxt("ERROR. Could not load music file: " + www.error, true); } else { AudioClip myClip = DownloadHandlerAudioClip.GetContent(www); audioSource.clip = myClip; } } }
问题原因
MacOS下,UnityWebRequest加载本地文件时必须使用file://协议前缀的URL格式。直接传入本地文件路径(如/Users/xxx/...)会被UnityWebRequest当作网络地址处理,导致连接失败。而File.Exists可以识别本地路径,所以返回true,但UnityWebRequest无法解析这种格式。
解决方案
统一将本地路径转换为符合URI规范的格式,自动添加file://前缀(Windows平台也兼容此格式,无需额外判断),同时用Path.Combine拼接路径避免跨平台斜杠问题。
修改后的代码:
void SetAudioFromStreamingAssets() { if (string.IsNullOrEmpty(StreamingAssetFilePath)) return; // 用Path.Combine跨平台拼接路径,自动适配系统分隔符 string fullpath = Path.Combine(Application.streamingAssetsPath, StreamingAssetFilePath); if (!File.Exists(fullpath)) return; // 将本地路径转换为URI格式,自动添加file://前缀 string uriPath = new Uri(fullpath).AbsoluteUri; StartCoroutine(SetAudioClipFromFile(source, uriPath)); } IEnumerator SetAudioClipFromFile(AudioSource audioSource, string path) { using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, AudioType.UNKNOWN)) { yield return www.SendWebRequest(); // 同时判断网络错误和HTTP错误,覆盖更多异常场景 if (www.isNetworkError || www.isHttpError) { VisDebug.AppendTxt("ERROR. Could not load music file: " + www.error, true); } else { AudioClip myClip = DownloadHandlerAudioClip.GetContent(www); audioSource.clip = myClip; } } }
额外说明
Path.Combine会根据当前系统自动使用正确的路径分隔符(Windows用\,Mac/Linux用/),避免手动拼接斜杠导致的路径错误。new Uri(fullpath).AbsoluteUri会自动生成符合平台要求的URI:Mac/Linux下为file:///Users/...,Windows下为file:///C:/...,UnityWebRequest可正确解析这种格式。- 新增
www.isHttpError判断,可捕获HTTP状态码异常,让错误处理更全面。
内容的提问来源于stack exchange,提问作者Guye Incognito
相关产品推荐
相关产品推荐

