簡(jiǎn)介:手把手的圖文講解CSHotFix結(jié)合ILRuntime進(jìn)行unity3d游戲的c# 注入更新戰(zhàn)斗邏輯bug和新增成長(zhǎng)功能界面邏輯的熱更新方式娶耍,力爭(zhēng)做到用c#就可以安安心心寫代碼,用virtual studio2015就可以快速高效的編程。?
1、整合ILRT。
2肛宋、注入C#,修復(fù)bug束世。
3酝陈、新增功能。
1毁涉、整合ILRT到Unity3D沉帮。
下載https://github.com/qq576067421/cshotfix工程,里面有主要需要關(guān)注的文件夾是“InjectorEditor”贫堰,“UnityDemo”穆壕。
先講UnityDemo。這個(gè)是一個(gè)Unity3d游戲的框架其屏,打開到如下路徑喇勋,你會(huì)看到我們已經(jīng)為你整合了一個(gè)pdb2mdb的工具,一個(gè)HotFixDll的熱更新工程偎行,和一個(gè)Assets文件夾川背。其中pdb2mdb是用來把vs的pdb調(diào)試文件轉(zhuǎn)換為mdb的mono用的。HotFixDll就是我們平時(shí)寫成長(zhǎng)邏輯睦优、修復(fù)戰(zhàn)斗bug的c#工程渗常。(圖片丟失了,我是從Word復(fù)制進(jìn)來的汗盘,你也可以從這個(gè)地址下載Word文檔查看)
進(jìn)入Assets皱碘,可以看到有CSHotFixLibaray和ILRuntime,前者是用于注入的生成代碼和測(cè)試用例隐孽;后者是ILRuntime1.2的庫文件癌椿。如果你沒有或者需要最新版的ilrt你可以從https://github.com/Ourpalm/ILRuntime下載最新版本健蕊。
下面講解下怎么整合ilrt。
首先定義一個(gè)類IGameHotFixInterface?,你可以在unity工程找到我已經(jīng)為你定義好的該類踢俄,里面定義了一些抽象函數(shù)缩功,用于在熱更新工程繼承。你也可以根據(jù)自己的需要自行定義都办,例如我可能會(huì)增加一個(gè)熱更新工程訪問android的接口string CallPlatform(string,object)
? ? ? ?然后新增一個(gè)被稱為IGameHotFixInterfaceAdapter的類嫡锌,該類你也可以在unity工程找到,它的作用是定義一個(gè)“跨域”訪問類的適配器琳钉。大家可以依葫蘆畫瓢势木。里面有注釋的,簡(jiǎn)單明了歌懒。
隨后啦桌,需要定義一個(gè)加載熱更新代碼的類,我這里命名為HotFixDllLoader及皂,出于演示的方便甫男,我用了一個(gè)TextAsset,把熱更新的dll的后綴添加bytes验烧,然后掛上去的板驳,這個(gè)如有不明白,可以自行百度噪窘。定義ilrt的APPDomain和IGameHotFixInterface字段笋庄。下面圖中詳細(xì)說明了代碼含義:
下面的代碼就是測(cè)試演示程序。
????void?Start?()
????{
????????Init();
????????Debug.Log("開始熱更新測(cè)試");
????????int?i = 15;
????????float?o = 0;
????????LCL.MainTestmt =?new?LCL.MainTest();
????????mt.Test2(i, o);
????????Debug.Log("結(jié)束熱更新測(cè)試");
????}
最后倔监,新建一個(gè)MainTest的類直砂,新建一個(gè)ClassPrivateTool的類用于訪問類的私有成員、字段等等浩习。需要留意的是ILRuntimeCLRBinding里面的內(nèi)容静暂。
好了ilrt基本已經(jīng)整合進(jìn)來了。
2谱秽、了解注入工具洽蛀。
注入工具目前來說弄得稍微簡(jiǎn)單了點(diǎn),需要各位多多貢獻(xiàn)代碼來使得他更加方便疟赊。當(dāng)然基本功能已經(jīng)滿足郊供。
首先進(jìn)入InjectorEditor\bin\Debug目錄,找到并雙擊InjectorEditor.exe近哟,
其中配置文件在同目錄的ini.txt 配置的路徑請(qǐng)參照我上面的配置就可以了驮审。你的有可能是盤符不一樣。另外這里最好弄成相對(duì)路徑,當(dāng)然需要你貢獻(xiàn)點(diǎn)代碼啦疯淫。
怎么操作呢地来?
1、修改init.txt熙掺,
2未斑、點(diǎn)擊“加載配置”,
3币绩、點(diǎn)擊“生成委托”蜡秽,此時(shí)會(huì)生成一些文件到UnityDemo\CSHotFixDemo\Assets\CSHotFixLibaray\DelegateGen路徑下面,文件是LCLFunctionDelegate.cs类浪,
4载城、卻換到unity3d編輯器等待它編譯完成。
5费就、編譯完成后回到“注入編輯器”,
6川队、點(diǎn)擊生成變量力细,這里的變量是我們用委托定需要進(jìn)行熱跟新的函數(shù)的全局靜態(tài)變量,留意有文件生成固额,
7眠蚂、切換到unity等待編譯。
8斗躏、編譯完成后切換會(huì)本編輯器逝慧。
9、點(diǎn)擊注入代碼按鈕啄糙。此時(shí)代碼注入完成笛臣。
10、使用ILSpy工具查看注入結(jié)果隧饼。自行下載ILSpy沈堡,使用方法大致是,把Assembly-CSharp.dll也就是unity自動(dòng)生成的代碼程序集拖入到ILSpy找到LCL命名空間下面的代碼燕雁,如下圖
此時(shí)诞丽,你可以看到右邊那個(gè)箭頭,我們已經(jīng)注入成功拐格。
11僧免、如果你的邏輯里面有一個(gè)地方錯(cuò)了,形如上圖的public void Test2(int a, float b)函數(shù)錯(cuò)了捏浊,那么記錄下LCLFieldDelegateName.__LCL_MainTest__Test2_Int32_Single__Delegate這個(gè)變量懂衩。
12、打開熱更新工程,如下圖:
13勃痴、留意該工程是否正常引用了unity的Assembly-CSharp谒所。
14、找到該工程唯一文件的如下代碼
????????public?override?void?Start()
????????{
m_Instance =?this;
????????????//注冊(cè)需要修復(fù)的bug
????????????LCLFieldDelegateName.__LCL_MainTest__Test2_Int32_Single__Delegate += OnHotFixTest;
????????}
????????private?void?OnHotFixTest(objectarg0,?intarg1,?float?arg2)
????????{
????????????Debug.Log("修復(fù)一個(gè)bug arg1:"+arg1+"arg2:"+arg2);
????????}
此時(shí)你可以發(fā)現(xiàn)LCLFieldDelegateName.__LCL_MainTest__Test2_Int32_Single__Delegate += OnHotFixTest代碼已經(jīng)有vs編輯器的智能提示沛申。
15劣领、為他添加一個(gè)+=的相應(yīng)函數(shù),委托的一般用法铁材。這里我添加的是OnHotFixTest函數(shù)尖淘。
16、至此注入的用法完畢著觉。
3村生、新增功能。
新增功能的比較簡(jiǎn)單饼丘,只需要在上面的熱更新工程里面寫各種代碼就可以了趁桃,里面包含了完整的init,update和destroy邏輯接口肄鸽。