lua熱重載就是運行時修改代碼不需要重新運行就可以生效的一種方案。首先先上方案鏈接:
https://github.com/asqbtcupid/lua_hotupdate
git上已經有人做出了現成的方案,拿來即用。
如果在Unity中使用需要檢測lua文件的修改,通過以下代碼進行:
using UnityEngine; using UnityEditor; public class LuaFastProcessor : AssetPostprocessor { protected const string HOT_FIX_STR = "HU.Update()"; public static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { if (Application.isPlaying) { string path = Application.dataPath + "\\StreamingAssets\\scripts\\hotupdatelist.lua"; StringBuilder sb = new StringBuilder(); sb.Append("local FileNameList = {\n"); for (int i = 0; i < importedAsset.Length; i++) { bool isLuaFile = importedAsset[i].EndsWith(".lua"); if (isLuaFile) { if (XLuaManager.Instance.LuaEnvIns != null) { sb.Append("\""); string strName = importedAsset[i].Replace(".lua", ""); strName = strName.Substring(strName.LastIndexOf("/") + 1); Debug.LogError(strName); sb.Append(strName); sb.Append("\","); } } } sb.Append(@" } return FileNameList"); File.WriteAllText(path,sb.ToString()); if(XLuaManager.Instance.LuaEnvIns!=null) XLuaManager.Instance.LuaEnvIns.DoString(string.Format(HOT_FIX_STR)); } } }
我們通過繼承AssetPostprocessor來監測lua文件修改。當修改的時候,我們找到哪些地方進行了修改,並寫入到hotupdatelistt文件中。
最后在call一次lua中的luahotupdate腳本的Update方法,腳本可以從上面git鏈接下到。
這里我用了git中的支持lua5.3的腳本,記得在lua的入口調用一次 luahotupdate.Init()方法。
主要原理就是package.loaded中拿到已經加載的信息,然后找到並load新的腳本並進行table的replace,具體如何replace請參照git中的代碼。