using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
//Encoding:UTF-8
public class NewBehaviourScript : MonoBehaviour
{
//128492555
string url = "http://xxx.xxx.com:5678/xxx_resume_99/StreamingAssets/aa/WebGL/xxxx.bundle";
int start = 0;
int size = 104857600;
int bundleSize = 128492555;
private void Start()
{
StartCoroutine(aa());
}
IEnumerator aa()
{
string path = Path.Combine(Application.persistentDataPath, "ABCache", "xxxx.bundle");
Debug.Log("---------1--------" + path);
UnityWebRequest webRequest = UnityWebRequest.Get(url);
webRequest.downloadHandler = new DownloadHandlerFile(path, true);
Debug.Log("---------2--------" + start + "---------" + (start + size - 1).ToString());
string end = start + size - 1 >= bundleSize ? "" : (start + size - 1).ToString();
webRequest.SetRequestHeader("Range", "bytes=" + start + "-" + end);
yield return webRequest.SendWebRequest();
if (string.IsNullOrEmpty(webRequest.error))
{
Debug.Log("---------3--------" + new FileInfo(path).Length);
if (start + size < bundleSize)
{
start += size;
StartCoroutine(aa());
}
}
else
{
Debug.LogError(webRequest.error);
}
}
}
- 分段缓存一个资源,每10M下载就会在112m左右的那一段报错,报错信息是空的,每100M下载就在第二段报错(一共122M),但是一次性下载就不会报错,这是我从正在做的项目中遇到问题写的测试,正式项目还会下载一个三百多k的小文件,我尝试每1k下载一段,这个小文件是不会追加写入出错,但是这个122m的大文件就会在最后出错
- 我也尝试用FileStream写入会发生同样的问题,只要是分段追加写入就会出错,合并之后一次性写入就不会,但是webgl项目要控制内存的使用,不能合并再写入,通过打印确认过了不是下载的问题,就是在FileStream.Wirte()时候出现的问题,所以不用再往UnityWebRequest相关方向回答了
---------------------最新更新---------------------
- 已经发现是unity的Emscripten版本过低的问题了,导致了写入idbfs系统时报错,目前我使用的是2020.3.18,升级到2021.2及以上版本就会解决,官网详细信息
- 毕竟是大项目升级unity跨度这么大的版本难度还是不小,现在准备通过js调用新版Emscripten来解决这个问题,目前还在研究
- 希望回答按照这个方向回答吧,大家们回答的有点偏,gpt我都问烂了,有用我早解决了
这个问题困扰我三个礼拜了,哪位可以帮我解决一下
---------------------结题--------------------
回答没有什么回答到点子上的,目前研究的进度是使用了最新官网下载的Emscripten构建了一个最新的fs文件管理系统文件,通过使用jslib引入调用操作自己构建的新的文件系统,现在已经可以追加写入的自定义的idbfs系统了,并且可以正常获取路径是否存在和资源大小,还未攻克的是资源在C#中加载,等完全跑通整个系统我写个文章发出来