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
相关产品推荐
相关产品推荐

