1. 程式人生 > >XLua學習 熱更新步驟整理

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