unity游戏框架学习-登录模块
之前的框架概述我们大概描述了登录模块的职责,今天我们在深入讨论一遍 ,今天主要学习下应用的更新:扩展包下载,热更
概述链接:https://www.cnblogs.com/wang-jin-fu/p/10975660.html
1.建立网络连接,如果没有网络弹出提示框,否则跳转到步骤2
unity判断网络连接:Application.internetReachability,返回值定义:
NetworkReachability.NotReachable:网络不可用
NetworkReachability.ReachableViaCarrierDataNetwork:运营商数据网络可用、
NetworkReachability.ReachableViaLocalAreaNetwork:wifi或有线网络是可用的
2.扩展包更新。android端需要先检查扩展包是否需要更新,如果要更新,检查内存是否足够,内存不足弹出提示框,否则跳转步骤3
对android扩展包有兴趣的童鞋可以参考官方文档:https://developer.android.com/google/play/expansion-files
在下载扩展包前记得判断下硬盘空间是否足够
android获取可用磁盘空间如下,也可以参考博客:https://blog.csdn.net/xiangruyimo122/article/details/73734159,里面说的更详细
static long GetSpace(File path) {
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getAvailableBlocks();
return totalBlocks * blockSize;
}
ios端获取可用磁盘空间可以参考博客:https://blog.csdn.net/xiangruyimo122/article/details/73734159
3.解压扩展包。如果要解压,检查内存是否足够,内存不足弹出提示框,否则跳转4
我们当前的项目压缩策略采用的是:扩展包使用lzma压缩,ab包使用lz4压缩,为了减少热更包下载体积,热更包会把所有的ab包在打包一层lzma压缩,lz4的ab包unity可以直接读取,所以这边的解压指的是解压lzma的包
lzma压缩、解压缩可以下载liblzma的库,也可以使用7zip插件进行解压缩
7zip解压缩可以参考雨松大神的:https://www.xuanyusong.com/archives/3095
4.热更。
(1)获取服务端版本号文件,如果需要强更,跳转到应用商店,如果需要更新,跳转下一步,否则跳转步骤5
跳转应用商店直接用Application.OpenURL接口打开商店链接就好了
(2)获取服务端md5文件,对比本地md5,获取需要更新的ab包列表
md5文件:文件的MD5值是独一无二的,只有文件发生改变了MD5值才会改变,当热更的时候我们需要知道那些AssetBundle发生了改变,就需要用到这个md5文件,下面是md5的生成:
static string CalcMd5StringFromHash(byte[] bytes)
{
string ret = "";
foreach (byte b in bytes) {
ret += Convert.ToString (b, 16);
}
return ret;
}
public static string GetFileMd5 (string path)
{
if (!File.Exists (path)) {
return "";
}
FileStream stream = File.OpenRead (path);
MD5 md5 = new MD5CryptoServiceProvider ();
byte[] result = md5.ComputeHash (stream);
stream.Close ();
return CalcMd5StringFromHash (result);
}
(3)下载并解压需要更新的ab包,这边需要检查内存是否足够,内存不足弹出提示框
unity AssetBundle有三种压缩模式,第一种是不压缩,这种压缩方式包体最大,但下载完成后的加载速度也是最快的,第二种是lzma压缩,也是默认的压缩格式,这种压缩格式压缩率最高,包体最小,但是加载速度最慢,因为要加载整包,第三种是lz4,包体大小和加载速度都还可以(推荐方式),后面资源管理会详细解说AssetBundle的打包方式,也可以自行参考unity API:https://docs.unity3d.com/530/Documentation/Manual/AssetBundleCompression.html
ab包的下载可以unity的UnityWebRequest接口类,可以参考https://www.jianshu.com/p/dbd0c1e53600
m_request = UnityWebRequest.Get(m_strUrl);
if (!string.IsNullOrEmpty (m_strPath)) {
// 是写到文件的情况开启断点续传
m_downloadHandler = new DownloaderHandler(m_strPath, OnProgress, OnCompleted);
m_request.chunkedTransfer = true;
m_request.disposeDownloadHandlerOnDispose = true;
m_request.SetRequestHeader("Range", "bytes=" + m_downloadHandler.DownedLength + "-");
m_request.downloadHandler = m_downloadHandler;
}
m_request.Send();
5.更新结束。登录sdk如腾讯账号,获取账号状态,如封号,弹出提示,否则跳转步骤6
这块会在后面SDKModule模块详细解说
6.登录游戏服务器(简称游服),获取游戏状态,如在维护状态,弹出提示,否则跳转步骤7
这块会在网络模块解说
7.新手引导(顺序跟步骤8可以对换。看情况)
8.预加载资源(可无,看情况),预加载结束跳转步骤9
9.请求服务端初始化数据(如main场景要显示内容需要的数据、小红点等),初始数据都接收完毕跳转步骤10
10.切换到mian场景,打开主界面
详细的流程如下图: