一接觸到新的東西,總想看看背後的原理是怎樣的,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裡面能下到的就是這個,直接下就行了 教程可以參考官網 按照步驟安裝好後,開啟渲染視...