huatuo示例项目源码分析与启发

上一节我们安装huatuo的开发环境,然后运行示例项目,体验了huatuo做热更新,这节课我们来分析示例项目的源码,掌握huatuo做热更新的主要的步骤,让你自己的项目很好的基于huatuo来组织热更新。有几个huatuo的原则要清楚:

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

huatuo示例项目源码分析与启发_第1张图片

启发1: 游戏代码如何分工程与项目

传统的我们的热更新项目会分为:框架代码+游戏逻辑。你也可以按照这个标准来划分,也可以继续分更小的颗粒度,比如游戏逻辑,可以拆分为:战斗,任务等。所以我们在使用huatuo做热更新的时候它首先做的是项目拆分,示例代码中利用Unity 的ADF机制,将项目分成了几个工程如下:

huatuo示例项目源码分析与启发_第2张图片

Main.csproj: 示例项目中入口主工程,示例项目从这个入口工程的代码开始运行;

这里给到我们的启发,我们在做自己游戏项目的时候,也可以根据自己的项目需求利用Unity ADF机制,来将项目划分称若干工程,而这些工程,可以单独的生成IL的.dll代码指令。这样就可以给IL2CPP_huatuo来解释执行了。由这里得到的启发,我们用huatuo做项目的时候我会将项目如下划分,供大家参考:

huatuo示例项目源码分析与启发_第3张图片

启发2: 扩展编辑器来生成所有.dll

由huatuo的特性,你装载哪个.dll,就可以动态解释执行对应的.dll的代码指令。所以我们就可以得到启发,把我们项目中所有的除Assembly-CSharp.dll以外的.dll都生成出来。比如1.0版本: Main.dll(游戏框架), game.dll(游戏主逻辑), task.dll(任务系统), … 比如2.0版本: main.dll, game.dll, task.dll, …。这样每次打包发布的时候,我们就可以使用这个编辑器扩展,编译出来所有的项目中的.dll,并生成一个所有.dll的md5文件变化列表。把最新的一份.dll与md5文件列表放服务器,把本地md5文件列表放包里,每次运行,我们增量下载最新版本的.dll后,我们只要比较服务器上的.dll md5文件列表,与当前版本对应.dll的md5文件列表,决定出哪些.dll需要装载进入il2cpp_huatuo,就直接装载即可实现热更新,那些没有变化的.dll,表示可以直接使用AOT模式下的机器指令,不用热更解释执行IL指令的.dll。我们来看下示例项目里面是如何编译我们的.dll指令的,参考对应的编辑器的扩展代码。打开示例项目的Editor/Huatuo文件夹的EditorHelper.cs, 如图:

huatuo示例项目源码分析与启发_第4张图片
huatuo示例项目源码分析与启发_第5张图片

没有什么可说的,调用API,打包.dll,直接copy过来就可以了。根据我们上面的分析,对.dll生成不同版本的.dll md5文件列表这个需要自己扩展一下,示例代码中没有。

启发3: 要热更哪部分代码,就装载哪部分代码

使用huatuo做热更新最后需要掌握的一个点就是,如何装载.dll的代码,当我们知道当前系统需要装载哪些.dll让huatuo解释执行后,最后一步就是让huatuo来装载,我们从这个示例项目的代码中可以看到il2cpp_huatuo是如何装载一个.dll的,当这个.dll被装载后,这部分的功能就被解释执行了。Huatuo如何加载代码,我们可以参考示例如下(代码来自LoadDll.cs):

huatuo示例项目源码分析与启发_第6张图片

它分为了发布模式与Edtior模式,发布模式就是直接把.dll装载进入il2cpp_huatuo的vm中,调用API函数: System.Reflection.Assembly.Load(.dll的二进制文件内容),在底层huatuo做了修改。编辑器模式下,调用AppDomain就行装载就可以了,所以这个代码我们直接可以参考拿过来,比较出哪些.dll要热更,我就转载它就可以了。

今天的分享就到这里了, 关注我们, 接下来还会继续更新huatuo热更的系列教程。

下节预告: 打造基于huatuo 热更的项目框架

你可能感兴趣的:(unity,c#,游戏引擎)