1. 程式人生 > 實用技巧 >記錄一下使用 ilruntime和StripEngineCode導致一些功能不生效的問題

記錄一下使用 ilruntime和StripEngineCode導致一些功能不生效的問題

前言

使用ilruntime熱更新框架做2D遊戲,在編輯器裡可以正常執行,但在真機上卻無法檢測到CapsuleCollider2D的碰撞。

填坑

本來不太明白原因,對比了專案裡生成的bind檔案。發現bind的CircleCollider2D碰撞是生效的。

在這裡插入圖片描述綠色標記的原有的,紅色的是我新增的。
問題得到解決。CapsuleCollider2D的碰撞開始生效了。

擴充套件

根據其他大佬對clr繫結的描述,clr繫結有兩個作用:
防止熱更層用到的框架層程式碼被裁減, 以及 加速熱更程式碼的執行。為什麼會被裁減呢?因為Unity打包的時候真的不把這個熱更dll看做dll,因為這個熱更dll是脫離unity框架層的。自然在unity打包的時候,為了包體大小會把認為沒有使用的程式碼全部過濾掉。這種情況下ILRuntime解釋執行的時候,去反射呼叫框架層程式碼就會被視為錯誤,因為框架層不存在這些被呼叫的程式碼。 加速熱更程式碼執行其實是ILRuntime解釋每條il指令的時候,都會去現有快取中查詢當前指令是否為重定向函式,如果為重定向函式,則直接呼叫,如果不是重定向函式,則會反射呼叫,反射這就是效率的隱患。重定向函式有自己的函式簽名格式,類似lua的LuaCsFunction。

沒有生效的原因應該就是沒有bind被裁減了原因,那麼為什麼我之前bind沒有紅色標識對應的bind檔案呢?
我搜索了整個熱更工程,發現程式碼中並沒有出現CapsuleCollider2D。而使用的唯一位置是預製體上有這個元件,所以根據熱更工程生成的dll檔案生成的bind檔案裡並沒有CapsuleCollider2D這個元件對應的bind檔案。
那應該怎麼解決呢?

解決方案

首先可以通過在熱更裡引用CapsuleCollider2D對應類檔案,比如new一個元件達到使用的目的。然後重新生成bind檔案。即可解決問題。

擴充套件解決方案2

如果是因為沒有bind導致被裁剪產生的bug,那麼為什麼會被裁剪呢,到底是什麼東西產生的這個操作呢?

稍一探究,發現了這個東西
在這裡插入圖片描述其實是一個優化程式碼使包體變得更小的一個功能。
所以如果我們不在乎包體大小,是不是可以取消這個功能使我們的程式碼不被裁剪呢?
沒錯,取消勾選也可以解決問題。

擴充套件解決方案3

那麼問題來了,我又想減小包體又想修復Bug怎麼辦?
這裡擴充套件一個strip engine code簡單的用法。
可以在Assets/下新增link.xml檔案來手動排除不被剖離的類。
在這裡插入圖片描述
這樣可以防止我們用到的類被裁減。

那麼我們怎麼獲取我們需要的類呢?全憑感覺和bug資訊,比如我們新增的第三方元件和sdk等等最好就新增一下。
其他個別被忽略的類可能會產生類似這樣的Bug輸出

在這裡插入圖片描述
我們可以通過這個ID在末尾地址查詢到自己被裁剪的類。

查詢地址

以上。