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

Unity打包Windows后Resources文件夹二进制文件加载问题求助

解决Unity打包后Resources中二进制文件的读取问题

嘿,我来帮你搞定这个Unity打包后读取Resources中二进制文件的问题!你遇到的情况很常见——编辑器里能用FileStream直接读路径,但打包后Unity会把Resources文件夹里的资源打包成内置压缩包,没法直接用文件路径访问。下面给你两种不用序列化或XML的解决方案,都是直接处理自定义二进制格式的:

方案一:用TextAsset中转(最简便)

Unity会把Resources里的二进制文件识别为TextAsset(不管你用什么后缀,比如.data、.bin都可以),我们可以先加载成TextAsset,再把它的字节数组转成MemoryStream,这样就能给BinaryReader用了。

代码示例

using System.IO;
using UnityEngine;

public class BinaryLoader : MonoBehaviour
{
    public void LoadUserData()
    {
        // 路径是相对于Resources文件夹的,不用加后缀和"Resources/"前缀
        TextAsset binaryAsset = Resources.Load<TextAsset>("UserData");
        
        if (binaryAsset == null)
        {
            Debug.LogError("找不到Resources中的二进制文件!检查文件名和路径是否正确");
            return;
        }

        // 将TextAsset的字节数据转为MemoryStream
        using (MemoryStream stream = new MemoryStream(binaryAsset.bytes))
        using (BinaryReader reader = new BinaryReader(stream))
        {
            // 这里写你的自定义读取逻辑,要和写入时的顺序一致
            string userName = reader.ReadString();
            int userLevel = reader.ReadInt32();
            float userScore = reader.ReadSingle();
            
            Debug.Log($"加载用户数据:{userName},等级:{userLevel},分数:{userScore}");
        }

        // 如果不需要缓存资源,可以手动卸载(可选)
        Resources.UnloadAsset(binaryAsset);
    }
}

注意事项

  • 确保文件放在Resources文件夹下,路径填写正确(比如文件在Resources/Saves/UserData.data,路径就写"Saves/UserData")。
  • 大文件建议用异步加载:Resources.LoadAsync<TextAsset>("UserData"),避免主线程卡顿。

方案二:用UnityWebRequest加载(适合大文件/异步场景)

如果你的二进制文件比较大,或者需要异步加载,也可以用UnityWebRequest来读取Resources里的文件,同样能拿到字节数组转成流。

代码示例

using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class AsyncBinaryLoader : MonoBehaviour
{
    public void LoadUserDataAsync()
    {
        StartCoroutine(LoadBinaryCoroutine("UserData.data"));
    }

    private IEnumerator LoadBinaryCoroutine(string fileName)
    {
        // 构建Resources文件的路径(打包后依然有效)
        string filePath = $"file://{Application.dataPath}/Resources/{fileName}";
        
        using (UnityWebRequest www = UnityWebRequest.Get(filePath))
        {
            yield return www.SendWebRequest();

            if (www.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError($"加载失败:{www.error}");
                yield break;
            }

            // 获取下载的字节数组
            byte[] data = www.downloadHandler.data;
            
            using (MemoryStream stream = new MemoryStream(data))
            using (BinaryReader reader = new BinaryReader(stream))
            {
                // 执行你的读取逻辑
                string userName = reader.ReadString();
                Debug.Log($"异步加载用户:{userName}");
            }
        }
    }
}

为什么原来的FileStream不行?

打包后,Unity会把Resources文件夹里的所有资源整合到一个或多个压缩的资源包中,不再是单独的文件,所以直接用文件路径访问自然找不到。必须通过Unity提供的资源加载API(比如Resources.Load、UnityWebRequest)来获取资源内容。

这两种方案都完全符合你的需求——不用序列化或XML,直接用BinaryReader处理自定义二进制格式,打包前后都能正常工作~

内容的提问来源于stack exchange,提问作者Cris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:57:51