You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:34:38