最近在搞APP项目,主要是Unity给安卓、IOS提供包,他们调用,自己写了一套场景资源加载方案,还是有一些问题,总体能用。
里面的一些东西也有从网上参考,项目工程百度云地址:https://pan.baidu.com/s/10f_HpP57sAS3NmW0m68CcA
主要内容:
1:AssetBundle打包,不同平台(安卓,IOS,PC),这一套用的是Unity官方推荐的AssetBundleBrowser,资源商店可以免费下载
2:服务器下载资源(网络判断,资源比对(是否更新),本地缓存)
3:解压资源,主要是对Zip包进行压缩。
4:资源的读取(AssetBundle读取)
下面简单介绍各个部分:
1 AssetBundle一键打包: Windows->Assetbundle Browser
1.1:添加需要打包的模型预制体、或者声音、文本、其他
1.2:配置打包平台(android,pc,ios),打包,需要打包三次,打包三个平台。
2资源服务器下载
我使用的是C#的HttpWebRequest,通过HTTP协议,封装了一个网络下载文件的方法,可以断点重传,当前网络判断,本地文件与服务器文件比对(通过访问服务器时间),进行文件更新下载。
try
{
request = HttpWebRequest.Create(url) as HttpWebRequest;
//断点续传核心,设置远程访问文件流的起始位置
request.AddRange((int)fileLength);
stream = request.GetResponse().GetResponseStream();
byte[] buffer = new byte[1024];
//使用流读取内容到buffer中
//注意方法返回值代表读取的实际长度,并不是buffer有多大,stream就会读进去多少
int length = stream.Read(buffer, 0, buffer.Length);
//Log.print("length:" + length);
isTest = false;
while (length > 0)
{
if (isStop) break;
fs.Write(buffer, 0, length);
fileLength += length;
progress = (float)fileLength / (float)totalLength;
//类似尾递归
length = stream.Read(buffer, 0, buffer.Length);
if(length<0)
{
DownLoadHandler.Instance.SetException(ExceptionType.load);
isStop = true;
}
TestoutPut(fileLength);
}
stream.Close();
stream.Dispose();
Log.print("last读取服务器文件:" + fileLength + ":--->" + totalLength + "---->" + progress);
}
catch(WebException e)
{
DownLoadHandler.Instance.SetException(ExceptionType.load);
Log.print("StartDownLoad Exception" + e.Message);
stream.Close();
stream.Dispose();
}
3 Zip包压缩这一块
我用的是SharpZipLib库,具体代码可以下载包,导入包就有。
4 Assetbundle加载这一块,我的Unity版本是2018.2.1,新版本Unity加载比较简单,只有几行代码,相比旧版本Unity是一个改进,不用一些麻烦的依赖关系。不过我这个是一个场景的AB包,不同的分包策略具体分析。
//两行代码搞定AB资源的加载
AssetBundle bundle = AssetBundle.LoadFromFile(path);
GameObject[] models = bundle.LoadAllAssets<GameObject>();
5:配置
配置下你的服务器地址以及文件路径,ReadPath:是你的AB包的文件名
注:
1:AssetManage类存储了AB包中所有的模型prefab,通过预制体name获取
2:移动端重新安装APK,要先清空缓存再测试。
3:Zip不局限于Assetbundle,还可以添加文本、声音、视频等资源。
6:方法调用:添加事件,生成模型