Unity如何處理lua熱重載


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中的代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM