XLua學習 熱更新步驟整理
前言
使用Xlua可以用lua語言覆蓋CS指令碼的內容。 這裡貼出官方的熱更新教程~ https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md 然後以下是本文大致的實現步驟: 1. 這裡使用AB包把需要修改的物體物件資源、要覆蓋CS指令碼的lua檔案打包 2. 客戶端從伺服器下載ab包,然後把新ab包快取在本地,直到伺服器下一次更新ab包 3. 然後客戶端用以前寫好的CS指令碼來從ab包獲取lua文字,放到本地沙盒路徑,然後再執行lua文字內容 4. lua文本里可以繼續從ab包快取裡獲取其他資源,並對原CS指令碼進行覆蓋來修改bug
準備
準備階段,也就是正常的用C#編碼階段,也可以說是作預處理階段,釋出遊戲之前,下次客戶端更新之前。 設定HotFix 設定[LuaCallSharp] 1. 在需要更新的類上加上[Hotfix] ,這個類需要提前預判,一般來說只更新UI部分,一般不更新物體,資料類 2. 在可能更新的類方法中前[LuaCallCsharp] 如:
[Hotfix] public class BeHotFixA : MonoBehaviour { public int num1 = 100; private int num2 = 200; [LuaCallCSharp] void Update () { if (Input.GetMouseButtonDown (0)) { GameObject go = Resources.Load ("ObjA") as GameObject; Instantiate (go); } } }
注意:這裡第三步驟的指令碼也是釋出遊戲之前寫好的指令碼
一、本地功能的邏輯實現
現在就進入處理階段了,此時出現bug,需要做熱更新了 如下就是要替代C#的Lua程式碼,通過xlua.hotfix()方法
--第二次開發-》開始使用lua更新原工程內容 --BeHotFixA類的私有成員可以被訪問 xlua.private_accessible(CS.BeHotFixA) --替換CS中某個類的某個方法 xlua.hotfix(CS.BeHotFixA,"Update",function(self) print(num1,num2) local cs = CS.UnityEngine if cs.Input.GetMouseButtonDown(0) then local ab = cs.GameObject.Find("GameObject"):GetComponent("DownLoadAB").ab local obj = ab:LoadAsset("ObjB") local go = cs.GameObject.Instantiate(obj) end end)
二、把資源進行打包
當發生bug,就需要把替代C#的lua檔案,要更改的UI、材質等資源 做成AssetBundle包
三、AB包放到伺服器
第三步應該是提前準備階段就做好的,因為這裡是在本機測試,實際放到伺服器,直接更改路徑即可
public class DownLoadABB : MonoBehaviour {
private string path = "file:///Users/neworigin/Desktop/YoungAB/ab";
public AssetBundle ab;
void Awake(){
WWW www = WWW.LoadFromCacheOrDownload (path, 11);//三
ab = www.assetBundle;//四
TextAsset hot = ab.LoadAsset ("hot.lua.txt") as TextAsset;
Debug.Log (hot.text);//五
string newPath = Application.persistentDataPath + "/hot.lua.txt";
Debug.Log (newPath);
//把AB裡面的Hot指令碼內容寫入到沙盒路檔案中
File.WriteAllText(newPath,hot.text);//五、六
}
四、下載新AB資源
使用WWW 下載AB包,然後獲取ab包的資源(lua)和其他要覆蓋資源
五、本地和伺服器進行檢測是否需要重新下載內容
執行遊戲時,會預設呼叫原先做好的CS指令碼,此時客戶端就會從伺服器獲取檔案,需要進行測試
六、執行下從伺服器(AB包裡)下載到本地的lua檔案
此CS指令碼需要在釋出遊戲前寫好,做預處理。當出現問題時,就可以從(這裡是沙盒路徑)本地路徑 找到lua來執行。 這裡的lua就是重新從伺服器下載好的lua文字
public class HotFix : MonoBehaviour {
void Awake(){
LuaBehaviour.luaEnv.AddLoader (MyLoader);
LuaBehaviour.luaEnv.DoString ("require 'hot'");
}
public byte[] MyLoader(ref string filepath) {
string path = Application.persistentDataPath + "/" + filepath + ".lua.txt";
string str = File.ReadAllText (path);
return System.Text.Encoding.UTF8.GetBytes (str);
}
}
另外補充下對AddLoader 和 MyLoader 的理解
AddLoader()引數是方法名,這個方法的型別是被定義好的委託型別, filepath是DoString下的require ‘hot’ 的 hot 名 此時就根據hot名配合沙盒路徑找到那個lua檔案 lua檔案被流讀出來,用字串的形式讀出,最後返回出來全部內容 被DoString() 全部執行
DoString(“print(‘如這樣的形式’)”)
七、執行Lua更新內容、Lua中就是要hotfix來完成原CS中程式碼的替換
就是執行Xlua的Dostring,來執行新寫好的lua文字內容
LuaBehaviour.luaEnv.DoString ("require 'hot'");
八、在下一次釋出版本時,把Lua內容替換成CS內容
以上就熱更新完成了,當下一次版本釋出時,就把原來的lua檔案覆蓋的CS的bug重構修復即可
這裡注意
每次Build 新的ab包後,伺服器載入也要更新,因為有快取,要設定新版本號來提示客戶端重新下載 如:WWW www = WWW.LoadFromCacheOrDownload (path, 11) 且版本號要從小到大加的。 每次CS指令碼更新之後,就要重新生成GenerateXlua一下,然後點Hotfix injext in Enditor一下。才能播放測試。
Lua文字因為沒有IDE提示,很容易寫錯(字元錯誤),建議在之前先用Resource.Load直接獲取Lua文字(不build ab包,不從伺服器下載) 直接獲取lua內容來進行測試,直到lua文字不報錯再換回來。
--------------------- 本文來自 liaoshengg 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/liaoshengg/article/details/81562633?utm_source=copy