啊,长叹一声,弄了一晚上,加半个白天
创新互联于2013年开始,先为田东等服务建站,田东等地企业,进行企业商务咨询服务。为田东企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。先说说历程吧,主要是踩的坑。
首先打包就不用说了。有.asseetbundle的,有.u3d的,还有就是生成md5列表
然后下载并保存就恶心了。
本来想的很好,思路其实也正确。
AssetBundle生成到StreamingAssets文件夹下
我在本机上(win10x64),IIS开了个站,开了FTP,用FileZilla把StreamingAssets文件夹上传到站上。
这样这些AssetBundle就有了url:“http://localhost:9999/StreamingAssets/a.assetbundle”
上传后,把本地的StreamingAssets文件夹删掉,程序中判断如果没有这个文件夹,则创建,下载md5列表文件,按文件中列出的文件列表把远程服务器上的所有assetbundle下载到本地来。这个过程的代码就不说了,不复杂,执行的也很顺利。主要是从下面开始坑了。
用WWW,从远程url地址下载,再用二进制写入本地路径文件
string localFilePath = "..."; //要保存到本地的文件全路径
string savePath = "..."; //文件存储的文件夹
string url = "http://..."; //要下载的远程文件地址
//判断一下文件要存储的文件夹是否存在,不存在则创建
if(!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
//下载
using(WWW www = new WWW(url))
{
yield return www;
if(www.error == null && www.isDone)
{
//写入本地文件
File.WriteAllBytes(localFilePath, www.bytes);
}
}
好的,到此为止,没有任何错误,StreamingAssets文件夹里的所有东东都下载到本地了,看文件大小好像也没有问题。
既然下载下来了,就得用啊,还是用WWW吧
string localFilePath="file:///.."; //本地要加载的AssetBundle文件路径
using(WWW www = new WWW(localFilePath))
{
yield return www;
if(www.error ==null && www.isDone)
{
AssetBundle ab = www.assetBundle;
GameObject go = ab.LoadAsset("go");
}
}
就在这一步
AssetBundle ab = www.assetBundle;
报错了:
Failed to decompress data for the AssetBundle 'Memory'`
但是请注意,用new WWW(localFilePath) 加载是没有任何问题的。
百撕不得其姐,于是搜索引擎查呗
一种说法是FileZilla向网站上传时要设置二进制
好吧,设置了,删掉重新上传,还是这样
于是把上传的文件直接拷贝过来,而不是在程序中用WWW下载,可以用,加载包没有问题
这就不好玩了,但是能确定的是问题是出在从远程下载并保存到本地这个步骤
那就换一种下载方法
用UnityWebRequest
using (UnityWebRequest req = UnityWebRequest.Get(fileUrl))
{
string filePath = "...";
string savePath = "...";
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
yield return req.SendWebRequest();
if (req.isNetworkError || req.isHttpError)
{
Debug.LogError(req.downloadHandler.text);
}
else
{
File.WriteAllBytes(filePath, req.downloadHandler.data);
Debug.Log(fileUrl + " downloaded");
}
}
这回更有趣,只下载了.manifest文件,而assetbundle还有.u3d这些包没有下载
看了一下,报的错是404 File Not Found
底下还提到了MIME映射
度娘查了一下,终于发现了真正的问题。
程序是没问题的,思路是正确的,问题出在了IIS的设置上
具体的说就是MIME的设置
即IIS中需要对不同的文件类型进行MIME映射才能使其类型的文件能在网站端正常的被读取下载,大概是这个意思。那就设置吧
win+R
输入compmgmt.msc回车
点击‘添加’
如上图
扩展名把你打包的扩展名填进去,如我是用的assetbundle和u3d
MIME类型中填写:application/octet-stream
好了,重启一下网站,再运行,OK了,正常下载和加载,出了一个小问题
就是文件夹下名为StreamingAssets的文件,即与文件夹同名,无扩展名的文件无法下载
再查一下
还是要设置MIME,无扩展名怎么办
还是上图,在文件扩展名一栏中填一个点"."
MIME一栏还是填:application/octet-stream
OK了
至于manifest文件,本身就在IIS的默认设置里有
也就是说,用IIS,一定要把你打包的assetbundle文件扩展类型设置MIME,比如你打的包是xxx.ab,那ab就要像这样设置MIME映射
再回过头来,还把UnityWebRequest换回WWW的加载方式,也OK了
即 ,此次问题就是出在IIS的设置上,思路和程序没有问题。
总结:
问题解决,大满足
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。