使用xlua 進行Unity3D 熱更新 2

2021-08-20 12:50:02 字數 3292 閱讀 1693

一接觸到新的東西,總想看看背後的原理是怎樣的,xlua也不例外。於是試著寫了一下,算是了解底層的實現原理,以後不用xlua也能有借鑑的地方。

xlua的熱修復原理實際上是在 c# 編譯成中間語言的時候,進行**的插入這部分用到了 mono.ceil 庫來操作,當然還有其他很多的庫也可以實現。 因為是在il的部分插入,因此直接支援il2cpp

直接進入主題

已知有乙個類

1

2

3

4

5

6

7

8

9

10

public

class inputtest

private

void hello

()}這個類在被unity呼叫的時候會輸出 「hello」

那麼如果我們想修改hello函式該怎麼做呢

1

2

3

4

string injectpath 

= @"./library\scriptassemblies\assembly-csharp.dll"

;assemblydefinition assemblydefinition 

= null

;var readerparameters 

=new readerparameters 

;assemblydefinition 

= assemblydefinition.

readassembly

(injectpath, readerparameters

);第一步 是要將當前**的 assembly 讀出來, u3d有3個assembly。 乙個是專案**叫 assembly-csharp.dll 乙個是編輯器** assembly-editor-csharp.dll.

還有乙個是外掛程式 assembly-plugin-csharp.dll. 因為 inputtest是專案**部分,所以讀取 assembly-csharp.dll即可

讀取成功後,所有的資料都在 assemblydefinition 中,只需要遍歷一下找到要修改的類即可

1

2

3

4

5

6

7

8

9

10

foreach 

(mono.

cecil.

typedefinition item in assemblydefinition.

mainmodule.

types)}

}}第二步 通過遍歷型別定義找到我們的類 「inputtest」 然後在 類定義中遍歷所有的函式定義,找到我們要修改的 「hello」函式

找到函式後,就可以正式做函式修改了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

var ins 

= method.

body.

instructions.

first()

;var worker 

= method.

body.

getilprocessor()

;var logref 

= assemblydefinition.

mainmodule.

import

(typeof

(debug

).getmethod

("log", 

new type));

worker.

insertbefore

(ins, worker.

create

(opcodes.

ldstr, 

"**** off"))

;worker.

insertbefore

(ins, worker.

create

(opcodes.

call, logref

));worker.

insertbefore

(ins, worker.

create

(opcodes.

ldstr, 

"**** on"))

;worker.

insertbefore

(ins, worker.

create

(opcodes.

call, logref

));type type 

= typeof

(injecttest

);if

(null 

!= type

)}var writerparameters 

=new writerparameters 

;assemblydefinition.

write

(injectpath, 

new writerparameters

());第三步 做了3件事情, 繫結了2個unityengine的log函式,列印了 「**** off」, 「**** on」 之後再繫結乙個類 「injecttest」中的靜態函式 say****()

這樣原本的 hello()函式就會在 列印」hello」之前先列印 「**** off」, 「**** on」 呼叫 injecttest.say****().

最後就是將執行的修改進行儲存 assemblydefinition.write

最後的最後用c#反編譯軟體開啟 assembly-csharp.dll 看看修改後的hello()函式

可以看到已經成功的修改啦。

使用SVN進行Unity3d版本管理總結

使用unity3d也有一段時間了,由於團隊一直使用svn進行版本管理,現總結一下 1 unity3d的二進位制資源必須加鎖進行版本控制,因為它沒辦法merge 2 unity3d自己產生的c 工程相關檔案,包括vs產生或者mono產生的,都不需要歸入版本控制 3 在新加入項時,unity3d會產生乙...

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

unity3d使用octane gpu渲染場景體驗

測試了一下u3d下的octane渲染器 目前是免費的,可以隨意測試 之前提到過了 現在趕緊過來試試 我測試電腦是win7 gtx1080 記得提前把顯示卡驅動之類打好 注意目前一定要2017.1的版本,不過現在free裡面能下到的就是這個,直接下就行了 教程可以參考官網 按照步驟安裝好後,開啟渲染視...