热更新

作者: 祝你万事顺利 | 来源:发表于2019-06-03 14:24 被阅读0次

    什么是热更新?
    不停机更新,实时更新。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#,遇到有错误的或者有问题需要热修复热更新的时候,才对需要热更的脚本方法进行处理。

    相关文章

      网友评论

          本文标题:热更新

          本文链接:https://www.haomeiwen.com/subject/zrbqxctx.html