什么是热更新?
不停机更新,实时更新。HotUpdateHotFix
Unity中需要APP重启
真正热更新不重启就做更新
为什么做热更新?
改善用户体验(节省流量、时间、操作程度),补丁形式,不用玩家重复下载游戏,就可以对游戏做热修复。
如何做热更新?unity3d热更新的方法?
Android应用的热更新:
1.将要执行的代码编译为库文件assembly dll.动态链接库
通过反射的方式再Unity中加载被打包的dll文件并执行:
将dll打包成AB包,通过www加载在AB包,通过反射获取到dll中的类
WWW www = WWW.LoadFromCacheOrDownload(Application.streamingAssetsPath + "/hot.u3d",6);
yield return www;
if(www.error != null)
{
print(www.error);
yield break;
}
AssetBundle assetBundle = www.assetBundle;
TextAsset textAsset = assetBundle.LoadAsset<TextAsset>("HotFix");
Assembly assembly = Assembly.Load(textAsset.bytes);
foreach (var item in assembly.GetTypes())
{
print(item);
gameObject.AddComponent(item);
}
注意:Unity2017不支持.Net3.5以上
android与IOS热更新有什么相同点和不同点
不同点:
IOS不允许某些反射的高级功能,因此不能用DLL的方式做热更新(mono打包时,会自动将反射部分功能禁止)
相同点:
移动端做热更新都是使用Unity3D+lua插件或框架
热更新需要注意的点:
资源、代码包括Lua代码都要达成assetbundle包来使用
注意几个重要的路径和文件夹:
Resources(会被压缩,不管是否使用都会被打进APK,只可读)
StreamingAssets(不会被压缩,持久化目录,只可读,不能坐热更新)
Application.datapath(asset文件夹下面的路径,也不能做热更新)
Application.persistentDataPath(持久化数据存储路径,沙盒文件夹,在打包之前此文件夹不存在。可读可写,没有任何内容限制,从服务器上下载的AB资源,都会放到这个文件夹下进行热更新)
加载资源流程
开始游戏->读取本地版本号信息->去服务器指定地址下载服务器版本号信息->对比两个版本号信息->如果不一致,从服务器上下载全部AB资源放入(持久化目录中去);
加载每个资源过程 第一步尝试从持久化目录中加载cube,如果不存在,即加载的为空,那么从StreamingAssets的文件夹中进行加载;
unity3D那些插件用于热更新?
ULua 基于反射 性能较差 效率低 速度慢 gcalloc频繁 停止维护只能支持到Unity3D 5.0以前
ToLua 使用的人多 维护起来快 各种静态方法效率高 要被热更新的文件必须使用Lua代码写的
SLua 没有知名项目,代码质量较好,可以阅读源码 使用静态方法 缺点同ToLua
C#Light 使用较少
XLua Tencent开发开源热更新插件 最大优点 平时开发使用C#,遇到有错误的或者有问题需要热修复热更新的时候,才对需要热更的脚本方法进行处理。