xlua是由騰訊維護的一個開源項目,我們可以在github上下載這個開源項目並查看一些相關文檔
官網:https://github.com/Tencent/xLua
配置文檔:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md
常見問題解答:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md
接下來我們來走一遍使用xlua的大致流程:
第一步:下載xlua:進入官網並下載整個xlua項目
第二步:將xlua導入項目:將下載后的xLua-master文件夾下的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進行注入

圖片來源:https://blog.csdn.net/ChinarCSDN/article/details/81124973
第四步:打開unity安裝目錄中的Editor\Data\Managed\Unity.Cecil.Pdb.cll、Mdb.dll、.cll三個文件拷貝到工程目錄下的xula文件夾下的src的editor文件夾下
關於XLua的使用:
xlua在項目中的啟動、調用、結束等全過程:
我們使用一個腳本來管理xlua的流程 HotfixScript

腳本中創建一個唯一的解釋器 new LuaEnv()
加載自定義loader AddLoader()
搜尋並執行lua文件 Dostring(" require 'lua文件名' ")
private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv();//創建解釋器 luaEnv.AddLoader(MyLoader);//加載自定義loader luaEnv.DoString("require 'fish'");//搜尋lua腳本 }
自定義Loader需要傳入一個文件路徑再返回讀取到的文件的byte數組
private byte[] MyLoader(ref string filePath)
{
string absPath = @"E:\app\unity2018\products\FishXlua\" + filePath+".lua.txt"; return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath)); }
最后的釋放資源分兩部分,一個是釋放方法委托,一個是解釋器,前者在OnDisable中調用lua代碼來執行,后者在OnDestroy中來釋放
void OnDisable() { luaEnv.DoString("require 'fishDispose'"); } void OnDestroy() { luaEnv.Dispose(); }
如何使用lua代碼對游戲內容進行更改?
在原來的可能出問題的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表示置空

總結一下使用xlua熱更新的開發過程:
- 首先開發業務代碼
- 在所有可能出現問題的類上打上hotfix標簽,在所有lua調用C#的方法上打上luacallcsharp標簽,在所有csharp調用lua的方法上打上csharpcalllua標簽
- 打包發布
- 修改bug時只需要更新lua文件,修改資源時只需要更新AB包,用戶只需要去下載AB包和lua文件就可以了
