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.MainTestmt = 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(objectarg0, intarg1, 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逻辑接口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,173评论 25 707
  • 《腾讯桌球:客户端总结》 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东...
    吴秦阅读 24,480评论 12 142
  • This article is a record of my journey to learn Game Deve...
    蔡子聪阅读 3,785评论 0 9
  • 很多鸡汤都在说选择很重要。可是怎么去选择呢? 好比在做一道英语的选择题,小明选不出来,于是去请教别人。 第一个学霸...
    熊猫_45a7阅读 255评论 0 4
  • 猛暑到,蝉儿闹。 叶儿深深不见影。 烈日下,一双人。 情真切切相扶衬。
    喜乐心记阅读 205评论 0 1