当前位置: 首页>移动开发>正文

Unity相同资源打包apk大小不一样 unity资源打包策略

最近在搞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),打包,需要打包三次,打包三个平台。

Unity相同资源打包apk大小不一样 unity资源打包策略,Unity相同资源打包apk大小不一样 unity资源打包策略_Unity相同资源打包apk大小不一样,第1张

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包的文件名

Unity相同资源打包apk大小不一样 unity资源打包策略,Unity相同资源打包apk大小不一样 unity资源打包策略_Unity相同资源打包apk大小不一样_02,第2张

注:

1:AssetManage类存储了AB包中所有的模型prefab,通过预制体name获取

2:移动端重新安装APK,要先清空缓存再测试。

3:Zip不局限于Assetbundle,还可以添加文本、声音、视频等资源。

Unity相同资源打包apk大小不一样 unity资源打包策略,Unity相同资源打包apk大小不一样 unity资源打包策略_服务器_03,第3张

6:方法调用:添加事件,生成模型

Unity相同资源打包apk大小不一样 unity资源打包策略,Unity相同资源打包apk大小不一样 unity资源打包策略_bundle_04,第4张

 

 

 


https://www.xamrdz.com/mobile/4kr1921865.html

相关文章: