前言
现在比较主流的逻辑更新是Lua方式,最常用的ToLua、SLua,XLua等等,但笔者是不太喜欢Lua开发,相比较直接写C#,lua的效率要低得多,这里GFFrameWork选择的是C#热更方案ILRuntime,这个方案由掌趣公司蓝大大维护,据我了解目前用这方案开发的项目还是不少的,ET框架也是采用这种方案,ILRuntime的前身其实是李总开发的L#方案,由于在大概15年左右,逻辑热更方案大战中L#方案没有sLua、uLua宣传的好,所以用的人就少了,然后李总就不太维护了,后面就有掌趣的蓝大接手维护,直到现在18年左右用的人还算不少,可能大家都比较信赖大厂维护吧,这跟Lua更新方案xLua类似,腾讯专人维护,后来居上的Lua热更方案,我用了一下ILRuntime,用一个demo尝试了一下,感觉还是蛮方便的,所以GFFrameWork就采用这种方案。关于AB更新和资源下载,我之前有写过一篇资源更新也可以先看一下。
C# VS Lua
Lua是一个已经非常成熟的解决方案,但是对于Unity项目而言,也有非常明显的缺点。就是如果使用Lua来进行逻辑开发,就势必要求团队当中的人员需要同时对Lua和C#都特别熟悉,或者将团队中的人员分成C#小组和Lua小组。不管哪一种方案,对于中小型团队都是非常痛苦的一件事情。
用C#来作为热更语言最大的优势就是项目可以用同一个语言来进行开发,对Unity项目而言,这种方式肯定是开发效率最高的。
Lua的优势在于解决方案足够成熟,之前的C++团队可能比起C#,更加习惯使用Lua来进行逻辑开发。此外借助luajit,在某些情况下的执行效率会非常不错,但是luajit现在维护情况也不容乐观,官方还是推荐使用公版Lua来开发。
效果
下方会有资源下载进度,这也是游戏首页下载资源的常用方式,当然也可以显示下载百分比。正式上线的游戏一般还会提示要下载多少M的文件,提醒玩家尽量选择Wifi环境下下载。
代码更新
ILRuntime
具体ILRuntime相关的文章可以参考,我这边搬运一点注意点主要是方便给自己看的。
优势
- 无缝访问C#工程的现成代码,无需额外抽象脚本API
- 直接使用VS2015进行开发,ILRuntime的解译引擎支持.Net 4.6编译的DLL
- 执行效率是L#的10-20倍
- 选择性的CLR绑定使跨域调用更快速,绑定后跨域调用的性能能达到slua的2倍左右(从脚本调用GameObject之类的接口)
- 支持跨域继承
- 完整的泛型支持
- 拥有Visual Studio的调试插件,可以实现真机源码级调试。支持Visual Studio 2015 Update3 以及Visual Studio 2017
代码案例
1 | ILRuntime.Runtime.Enviorment.AppDomain appdomain; |
官方Demo
https://github.com/Ourpalm/ILRuntimeU3D
调试插件
https://github.com/Ourpalm/ILRuntime/releases
GFFrameWork打包dll
操作
说明
这里两种编译方式,分别是对应用Mono的Api编译和.Net的Api编译,编译会生成dll和pdb(.net)/mdb(mono),我们是Unity开发所以基本首选mono编译,pdb和mdb是调试文件。
编译代码
1 | using System.Collections.Generic; |
思路:搜集工程目标目录中所有的.dll和.cs文件,然后通过API CompilerParameters cp = new CompilerParameters()编译dll。
资源更新
操作步骤
1.Tools/资源一键打包->输入版本号->选择要生成的平台的资源->一键导出->选择要导出的路径->生成目标平台的AB资源
2.资源加密:选择资源转hash格式,将刚刚生成的资源生成一份服务器用的资源
注意事项
我们上传文件到服务器,估计很多人会选择Filezilla,之前用感觉挺好用的,因为我一直用window端的客户端,但mac上Filezilla有bug,上传的文件大小变了,因为这个bug,我困扰了好久,好不容易查到是打包出来的文件跟服务器下载下来的文件大小不一致,一开始怀疑是不是Unity的bug,用Unity的WebClient的DownloadFileTaskAsync下载的然后换了一个api还是不行,然后换UnityWebRequest.Get,换unity版本,最后才细心的发现上传到服务器端文件大小就不一致,还好用的内网服务器能在服务器目录上看到服务器上文件的大小,如果是远程CDN估计不容易发觉这个bug,然后我就采用U盘拷贝的方式,将生成的资源放到服务器上才解决了问题。心得:碰到问题要沉着冷静,发现蛛丝马迹,感觉程序员能当侦探,哈哈!
下载文件
打包好的服务器用的资源文件由一堆hash文件和config文件组成,config文件是资源清单文件,记录了资源版号和资源hash键值对。
下载文件的正规流程,首先下载查看本地是否有资源清单文件,如果没有则下载资源,如果有则对比资源版本号,如果相同则跳过,如果不同则对比资源hash找出不一样的资源下载覆盖然后下载config文件覆盖本地。
demo中为了演示下载效果,就每次点击下载都会直接下载,没有按照正规的流程来,在正式商业项目可以自己修改要一下。
温馨提示
上面流程图软件可以用processon,在线web软件,可以画流程图,可以画UML,拓扑图,思维导图等等非常方便!
代码
1 | using GF.Debug; |
File.WriteAllBytes(路径,bytes) 写二进制到本地
File.WriteAllText(路径,string) 写字符串到本地 默认是UTF8,当然也可以指定编码
这里也没有考虑断点续传,如果因为网络原因中途下载失败,会重头开始下,项目大的话这是不能容忍的,当然也是可以优化的一个地方,可以参考前言里面我给的之前的断点续传的文章优化一下。
GFFramework地址
https://github.com/dingxiaowei/GFFrameWork