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"); }