Unity3D游戏 CSHotFix热更新框架使用指南

发表于2018-01-30
评论0 5.5k浏览

简介:手把手的图文讲解CSHotFix结合ILRuntime进行unity3d游戏的c# 注入更新战斗逻辑bug和新增成长功能界面逻辑的热更新方式,力争做到用c#就可以安安心心写代码,用virtual studio2015就可以快速高效的编程。 

1、整合ILRT

2、注入C#,修复bug

3、新增功能。

1、整合ILRTUnity3D

   下载https://github.com/qq576067421/cshotfix工程,里面有主要需要关注的文件夹是InjectorEditor”,“UnityDemo”。

先讲UnityDemo。这个是一个Unity3d游戏的框架,打开到如下路径,你会看到我们已经为你整合了一个pdb2mdb的工具,一个HotFixDll的热更新工程,和一个Assets文件夹。其中pdb2mdb是用来把vspdb调试文件转换为mdbmono用的。HotFixDll就是我们平时写成长逻辑、修复战斗bugc#工程。(图片丢失了,我是从Word复制进来的,你也可以从这个地址下载Word文档查看

进入Assets,可以看到有CSHotFixLibarayILRuntime,前者是用于注入的生成代码和测试用例;后者是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逻辑接口。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引