Unity 搭建ILRuntime热更新开发环境
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:热更新原理图
<hr/>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:热更项目位置
<hr/>
图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解释执行。
页:
[1]