1. 程式人生 > 實用技巧 >Siki_Unity_3_xLua遊戲中的熱更新

Siki_Unity_3_xLua遊戲中的熱更新

xLua遊戲中的熱更新

課時3~5:熱更新方案

開發者不用重新打包上傳;
使用者不用重新下載安裝包;
安裝包不用通過商店稽核

現有的成熟熱更新外掛:
  toLua/ xLua -- 執行lua程式碼,實現了lua和c# 的程式碼互動

xLua(騰訊開源)介紹:https://gameinstitute.qq.com/community/detail/111400

市面上用的多的的熱更新方案:

uLua(http://ulua.org/index.html):基於toLua(外掛)擴展出的熱更新方案,但是不再維護,作者去維護toLua了
toLua:uLua的作者基於toLua外掛開發出了名為LuaFramework的熱更新方案
sLua:程式碼質量好,效能比toLua低

Lua為解釋性語言,因此無需進行編譯過程,使用者在下載熱更新程式碼後即可直接生效,不需進行打包

課時6~8:xLua外掛的匯入及簡單使用

github找到xLua,進行clone,將下載好的程式碼壓縮包匯入unity工程即可
  這裡面也包含了官方使用demo及教程

C#與Lua的程式碼互動

// c#中呼叫lua程式碼

private LuaEnv luaEnv;

void Start(){
    luaEnv = new LuaEnv();
    luaEnv.DoString("print('Hello world!')");

}

void OnDestroy(){
    luaEnv.Dispose();
}

一個LuaEnv例項對應一個Lua虛擬機器,處於開銷的考慮,建議全域性唯一

在Lua中呼叫C#方法:

luaEnv.DoString( "CS.UnityEngine.Debug.Log("HelloWorld")" );即可
1. C#方法名要寫包含名稱空間的全稱

任務9~11:通過Lua檔案進行呼叫

原理為通過Resources.Load進行Lua檔案的讀取,並將讀取的程式碼放入luaEnv,DoString()執行

TextAsset ta = Resources.Load<TextAsset>("helloworld.lua");
luaEnv.DoString(ta.text);

正常的載入方法為:通過lua的內建loader進行載入

使用:

將HelloWorld.lua.txt檔案放入Resources資料夾下

luaEnv.DoString( "require 'HelloWorld' ");

此時將HelloWorld.lua中的程式碼全部運行了一遍

原理:

require實際上會呼叫一個個的loader嘗試載入,有一個載入成功則返回,若全部失敗則報檔案找不到

xLua除了原生loader之外,還擴充套件了從Resource資料夾中載入的loader,前提條件是這些lua檔案需要加上.txt字尾

官方建議

建議的載入Lua的指令碼方式:
整個程式只有一個DoString()進行DoString("require 'main'"),然後在main.lua中載入其他lua指令碼

通過自定義的Loader進行載入

使用自定義Loader的好處:可以將lua檔案放在自定義目錄下,也可以放在伺服器端進行下載動態取得

void Start(){
    LuaEnv env = new LuaEnv();
    env.AddLoader(MyLoader);    // 這邊手動添加了一個自定義loader的回撥
    env.DoString("require 'xxx'");    
    // 不僅會去Resource中找,也會通過自定義loader的回撥去查詢。
    // 注意:找到一個loader後就不會繼續查找了
    env.Dispose();
}

// 這裡即為自定義的loader,當上面執行env.DoString("require")時,
// 會將該自定義loader也加入查詢。
// 返回值不為空時,即表示找到lua程式碼並返回,為空時會繼續遍歷查詢其他loader
private byte[] MyLoad(ref string path){
    if(path=="xxx")
    return System.Text.Encoding.UTF8.GetBytes("print 1");
}