Unity3D XLua熱更新用法的大致流程

2022-08-09 14:57:17 字數 2532 閱讀 1471

官網

配置文件:/blob/master/assets/xlua/doc/hotfix.md

常見問題解答:/blob/master/assets/xlua/doc/faq.md

資料夾下的assets資料夾拷貝到專案資料夾下,將tools資料夾拷貝到專案資料夾assets的同級目錄下並刪除其中的system.core.dll檔案

這一步完成後unity編輯器的工具欄會多出乙個xlua的選項,其中裡面會有兩個子選項(gennerate code生成指令碼、clear gennerate code清除指令碼)

第三步:開啟熱更新:開啟playersettings,開啟指令碼巨集命令標誌輸入hotfix_enable並按enter(即找到othersetins中的scriptsingdefinesymbols輸入hotfix_enable並按enter)敲完按回車才會進行編譯

編譯完成後xlua選項中多了一項(hofix inject in editor

c#指令碼發生了任何更改都需要按選項1來生成**,有問題就選項2清楚指令碼再重新生成,生成**結束後會debug乙個finished出來,此時再選項3進行注入

第四步:開啟unity安裝目錄中的editor\data\managed\unity.cecil.pdb.cll、mdb.dll、.cll三個檔案拷貝到工程目錄下的xula資料夾下的srceditor資料夾下

xlua在專案中的啟動、呼叫、結束等全過程:

我們使用乙個指令碼來管理xlua的流程hotfixscript

指令碼中建立乙個唯一的直譯器 new luaenv()

載入自定義loader addloader()

搜尋並執行lua檔案 dostring(" require 'lua檔名' ")

private

luaenv luaenv;

void

awake()

自定義loader需要傳入乙個檔案路徑再返回讀取到的檔案的byte陣列

private byte myloader(ref stringfilepath)

最後的釋放資源分兩部分,乙個是釋放方法委託,乙個是直譯器,前者在ondisable中呼叫lua**來執行,後者在ondestroy中來釋放

void

ondisable()

void

ondestroy()

在原來的可能出問題的c#類上打上hotfix標籤,在方法上打上luacallcsharp標籤

之後便可在lua指令碼中進行更改

修改格式如下:

xlua.hotfix(cs.類名,'方法名',function(self)

具體實現的方法體

end)

ps:當在lua指令碼中可能需要用到某個c#類中的私有訪問屬性欄位時,可以使用以下格式來獲取訪問許可權

xlua.private_accessible(cs.類名)

呼叫c#中的一些自帶的類、方法

cs.unityengine、cs.類名.方法……

通過自身物件呼叫自身方法:self:方法名()   或者   self.方法名(self)  前者使用冒號的方式是為了簡寫傳入self引數的過程

解綁委託:專門用乙個lua指令碼來負責解綁所有lua呼叫重寫過的方法

例如:xlua.hotfix(cs.類名,'方法名',nill)

與改寫方法型別,只是在最後乙個引數將function改成了nill表示置空

Unity3D熱更新全書 PageZero

unity3d熱更新全書 何謂熱更新,為何熱更新,如何熱更新 這一篇是寫給對熱更新完全沒概念的人 unity3d熱更新全書 資源載入 一 從assetbundle說起 這一篇是 使用assetbundle來做資源更新的問題,希望能讓更多人理解assetbundle是有害的 unity3d熱更新全書 ...

使用xlua 進行Unity3D 熱更新 2

一接觸到新的東西,總想看看背後的原理是怎樣的,xlua也不例外。於是試著寫了一下,算是了解底層的實現原理,以後不用xlua也能有借鑑的地方。xlua的熱修復原理實際上是在 c 編譯成中間語言的時候,進行 的插入這部分用到了 mono.ceil 庫來操作,當然還有其他很多的庫也可以實現。因為是在il的...

Unity中Shader是否可以熱更新的測試

在unity的資源中,shader是比較特殊的一類。主要有下面幾個疑問 1.shader算是 並且需要編譯。那麼是否可以熱更新?2.ab中載入進來的shader是否可以通過shader.find 名稱 來索引?3.在使用shader feature關鍵字後,build時忽略的變種是否要在執行時編譯?...