Unity3D游戏 CSHotFix热更新框架使用指南
简介:手把手的图文讲解CSHotFix结合ILRuntime进行unity3d游戏的c# 注入更新战斗逻辑bug和新增成长功能界面逻辑的热更新方式,力争做到用c#就可以安安心心写代码,用virtual studio2015就可以快速高效的编程。
1、整合ILRT。
2、注入C#,修复bug。
3、新增功能。
1、整合ILRT到Unity3D。
下载https://github.com/qq576067421/cshotfix工程,里面有主要需要关注的文件夹是“InjectorEditor”,“UnityDemo”。
先讲UnityDemo。这个是一个Unity3d游戏的框架,打开到如下路径,你会看到我们已经为你整合了一个pdb2mdb的工具,一个HotFixDll的热更新工程,和一个Assets文件夹。其中pdb2mdb是用来把vs的pdb调试文件转换为mdb的mono用的。HotFixDll就是我们平时写成长逻辑、修复战斗bug的c#工程。(图片丢失了,我是从Word复制进来的,你也可以从这个地址下载Word文档查看)
进入Assets,可以看到有CSHotFixLibaray和ILRuntime,前者是用于注入的生成代码和测试用例;后者是ILRuntime1.2的库文件。如果你没有或者需要最新版的ilrt你可以从https://github.com/Ourpalm/ILRuntime下载最新版本。
下面讲解下怎么整合ilrt。
首先定义一个类IGameHotFixInterface ,你可以在unity工程找到我已经为你定义好的该类,里面定义了一些抽象函数,用于在热更新工程继承。你也可以根据自己的需要自行定义,例如我可能会增加一个热更新工程访问android的接口string CallPlatform(string,object)
然后新增一个被称为IGameHotFixInterfaceAdapter的类,该类你也可以在unity工程找到,它的作用是定义一个“跨域”访问类的适配器。大家可以依葫芦画瓢。里面有注释的,简单明了。
随后,需要定义一个加载热更新代码的类,我这里命名为HotFixDllLoader,出于演示的方便,我用了一个TextAsset,把热更新的dll的后缀添加bytes,然后挂上去的,这个如有不明白,可以自行百度。定义ilrt的APPDomain和IGameHotFixInterface字段。下面图中详细说明了代码含义:
下面的代码就是测试演示程序。
void Start ()
{
Init();
Debug.Log("开始热更新测试");
int i = 15;
float o = 0;
LCL.MainTest mt = new LCL.MainTest();
mt.Test2(i, o);
Debug.Log("结束热更新测试");
}
最后,新建一个MainTest的类,新建一个ClassPrivateTool的类用于访问类的私有成员、字段等等。需要留意的是ILRuntimeCLRBinding里面的内容。
好了ilrt基本已经整合进来了。
2、了解注入工具。
注入工具目前来说弄得稍微简单了点,需要各位多多贡献代码来使得他更加方便。当然基本功能已经满足。
首先进入InjectorEditor\bin\Debug目录,找到并双击InjectorEditor.exe,
其中配置文件在同目录的ini.txt 配置的路径请参照我上面的配置就可以了。你的有可能是盘符不一样。另外这里最好弄成相对路径,当然需要你贡献点代码啦。
怎么操作呢?
1、修改init.txt,
2、点击“加载配置”,
3、点击“生成委托”,此时会生成一些文件到UnityDemo\CSHotFixDemo\Assets\CSHotFixLibaray\DelegateGen路径下面,文件是LCLFunctionDelegate.cs,
4、却换到unity3d编辑器等待它编译完成。
5、编译完成后回到“注入编辑器”,
6、点击生成变量,这里的变量是我们用委托定需要进行热跟新的函数的全局静态变量,留意有文件生成,
7、切换到unity等待编译。
8、编译完成后切换会本编辑器。
9、点击注入代码按钮。此时代码注入完成。
10、使用ILSpy工具查看注入结果。自行下载ILSpy,使用方法大致是,把Assembly-CSharp.dll也就是unity自动生成的代码程序集拖入到ILSpy找到LCL命名空间下面的代码,如下图
此时,你可以看到右边那个箭头,我们已经注入成功。
11、如果你的逻辑里面有一个地方错了,形如上图的public void Test2(int a, float b)函数错了,那么记录下LCLFieldDelegateName.__LCL_MainTest__Test2_Int32_Single__Delegate这个变量。
12、打开热更新工程,如下图:
13、留意该工程是否正常引用了unity的Assembly-CSharp。
14、找到该工程唯一文件的如下代码
public override void Start()
{
m_Instance = this;
//注册需要修复的bug
LCLFieldDelegateName.__LCL_MainTest__Test2_Int32_Single__Delegate += OnHotFixTest;
}
private void OnHotFixTest(object arg0, int arg1, float arg2)
{
Debug.Log("修复一个bug arg1:"+arg1+"arg2:"+arg2);
}
此时你可以发现LCLFieldDelegateName.__LCL_MainTest__Test2_Int32_Single__Delegate += OnHotFixTest代码已经有vs编辑器的智能提示。
15、为他添加一个+=的相应函数,委托的一般用法。这里我添加的是OnHotFixTest函数。
16、至此注入的用法完毕。
3、新增功能。
新增功能的比较简单,只需要在上面的热更新工程里面写各种代码就可以了,里面包含了完整的init,update和destroy逻辑接口。