Unity热更新目前主流的方案有: Lua, ILRuntime, puerts, huatuo方案。前两个大家都比较熟悉了,puerts 是基于TypeScript开发的热更新,huatuo是基于C#的方案。后两个大家会比较陌生。本系列分享基于ILRuntime来做热更新。
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
ILRuntime热更新原理
ILRuntime热更新原理是基于Unity引擎,内置一个.net 字节码解释器,解释执行.net字节码。对于开发人员而言,使用.net技术将游戏逻辑代码开发出.net标准的字节码动态库(.dll)。将.net字节码的dll放入到Unity的资源里面,然后加载这个资源文件里面的.net字节码,再用内置的解释器解析执行游戏逻辑。如果把这个”字节码.dll资源”放服务器,就可以实现更新下载,然后再装载运行。有原理可知,我们实现ILRuntime来开发项目,就可以分成2个部分:
(1):内置.net 字节码解释器到Unity游戏项目中;
(2):来创建一个.dll的.net项目工程,基于Unity引擎的.dll的库来开发游戏逻辑;
第(1)部分,ILRuntime框架已经为我们实现了.net字节码解释器,我们只要将它的代码拿过来,同时在我们的项目中初始化ILRuntime虚拟机解释器。第(2)部分,我们使用.net开发工具(Microsoft visual studio)创建一个.dll的.net项目,后面我们称为”逻辑热更项目”,同时把unity引擎里面的.dll的库添加引用到逻辑热更项目中,这样我们在开发游戏逻辑的时候就能直接引用到Unity的API和相关的智能提示。这样就让c#开发的Unity开发者最大限度的保留了Unity的开发习惯,上手很快。
图1.1-1:热更新原理图
ILRuntime 开发环境搭建
了解了上面的原理,我们搭建ILRuntime就很好理解了,首先第(1)部分,安装ILRuntime解释器代码库,同时在项目实例化ILRuntime解释器。这里我们以Unity 2020.2.3f1版本为例,来进行环境配置讲解。很简单,先安装.net,版本要求>= 4.6.1,我用的是4.7, 然后打开Unity编辑器,点击Window菜单, 选择PackageManager, 搜索ILRuntime安装即可。如图1.1-2所示:
图1.1-2:热更新原理图
注: Packages记得选”Unity Registry”, 然后安装ILRuntime即可,同时打开Unity PlayerSetting 选unsafecode模式。安装好ILRuntime开发环境后,接下来在项目中实例化ILRuntime的解释器。编写一个ILRuntimeWrapper.cs的全局单例,引入using ILRuntime.Runtime.Enviorment;ILRuntime名字空间,在Awake中实例化ILRuntime解释器实例: this.appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
public class ILRuntimeWrapper : UnitySingleton<ILRuntimeWrapper>
{
private bool isGameStart = false;
AppDomain appdomain; //
System.IO.MemoryStream fs;
System.IO.MemoryStream p;
public override void Awake() {
base.Awake();
this.isGameStart = false;
this.appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
}
}
AppDomain,就可以理解为是全局唯一的ILRuntime的解释器对象实例,主要用它来解释执行我们的.net热更项目的.dll字节码。
接下来安装第(2)部分, 创建一个基于.net的.dll的工程项目,作为可热更的游戏逻辑项目。 (如果你懒,可以拷贝使用示例代码里面的逻辑热更项目,.net版本和你自己的保持一致即可)这个项目有几个特点:必须最终是要生成.dll的.net动态库,要加上Unity使用的依赖,所以我们专门在这个项目下创建一个文件夹UnityDlls用来存放开发中依赖Unity的动态库。如图所示:
图1.1-3:热更项目位置
图1.1-4:依赖Unity的Dll
当我们开发游戏逻辑的时候,使用了Unity的那些库,只要从我们Unity的引擎里面找到这些.dll,然后复制到UnityDlls下面,然后添加引用到热更项目工程就可以了(这样你在热更项目就可以尽情的使用Unity的API,而且还是C#的)。如何找呢?有个小技巧,你打开标准的Unity项目工程,在” Assembly-CSharp”这里的引用就能看到我们使用的Unity的.dll, 例如我们要使用动画播放组件Animation, 它在UnityEngine.AnimationModule.dll里面,你就可以复制路径,找到这个.dll,然后把这个.dll拷贝到”逻辑热更项目”的UnityDlls里面,然后在逻辑热更项目中添加这个.dll的引用。
图1.1-5:如何找到依赖的Unity的Dll的路径
图1.1-6
图1.1-7
配置一下生成.dll的路径,我们把这个.dll生成到Unity项目里面的StreammingAssets路径下,这样方便我们编译后直接在Unity中马上就可以执行,所以我这边在逻辑热更项目中配置输出路径,如图:
图1.1-8:配置输出路径到StreammingAssets/Hotfix下
这样环境就配置好了,在逻辑热更项目中开发逻辑代码,开发完成以后,逻辑热更项目生成.dll给Unity,Unity 加载.dll解释执行。