xLua自定義加載器


xLua入門基礎

環境配置

github下載xLua文件

xLua是騰訊開發,據說比較先進;

下載下來后將Plugins和XLua文件夾考進項目;

image-20211009175311012

Plugins多平台權限;XLua和C#交互;

test.lua文件中只寫了一句print(Hello LittlePerilla);

運行Lua代碼

運行xLua代碼需要創建lua解釋器,結束要釋放解釋器;

DoString是將字符串當成lua代碼執行;

//lua解釋器
LuaEnv luaenv = new XLua.LuaEnv();

//運行lua代碼,字符串當lua代碼執行;
luaenv.DoString("print('hello world!')");

//釋放解釋器
luaenv.Dispose();

運行C#代碼

CS.為xLua中調用C#代碼的關鍵字;

LuaEnv luaenv = new XLua.LuaEnv();

//運行lua代碼,字符串當lua代碼執行;
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");

luaenv.Dispose();

返回值

LuaEnv luaenv = new XLua.LuaEnv();

object[] data = luaenv.DoString("return 100, false");
Debug.Log($"{data[0]}__{data[1]}");

luaenv.Dispose();

自定義加載器

默認加載器路徑為:steamingAssets;

LuaEnv luaenv = new LuaEnv();
//加載test.lua,這里的require是從默認加載器:steamingAssets中加載
luaenv.DoString("require('test')");
luaenv.Dispose();

自定義加載路徑:

所有的lua腳本都放在Assets同級目錄:DataPath\Lua;

image-20211009180528216

xLua解釋器中AddLoader方法;參數是一個委托;

public delegate byte[] CustomLoader(ref string filepath);

filepath這個path就是require(path)的參數;

通過委托返回.lua文件中所有的代碼字節數據,提供給解釋器調用;

public void MyLoader()
{
    LuaEnv luaenv = new LuaEnv();
    //自定義加載器,加入xlua的解析路徑
    //public delegate byte[] CustomLoader(ref string filepath);
    luaenv.AddLoader(ProjectLoader);
    
    luaenv.DoString("require('test')");
    luaenv.Dispose();
}

//自定義加載器先於系統加載器;
//未加載到文件,返回空;
public byte[] ProjectLoader(ref string filepath)
{
    string path = Application.dataPath;
    path = path.Substring(0, path.Length - 6) + "DataPath/Lua/" + filepath + ".lua";
    //讀取文件為字節數組
    if(File.Exists(path))
        return File.ReadAllBytes(path);
    else
    {
        Debug.Log("未找到路徑文件");
        return null;
    }
}

xLua解釋器單例

LuaEnv在全局只能有一個,頻繁創建和釋放會造成性能浪費,因此寫成單例,封裝一些方法;

單例中包括私有方法——自定義加載器路徑;

供外部調用方法:

Free——釋放解釋器

DoString——調用Lua代碼

Gobal——獲取Lua全局參數

public class XluaEnv
{
    #region LuaEnv Singleton
    private static XluaEnv instance;

    private XluaEnv()
    {
        luaEnv = new LuaEnv();
        luaEnv.AddLoader(ProjectLoader);
    }

    public static XluaEnv I
    {
        get
        {
            if (instance == null)
                instance = new XluaEnv();
            return instance;
        }
    }
    #endregion

    #region LuaLoader

    private LuaEnv luaEnv;
    
    private byte[] ProjectLoader(ref string filepath)
    {
        string path = Application.dataPath;
        path = path.Substring(0, path.Length - 6) + "DataPath/Lua/" + filepath + ".lua";
        //讀取文件為字節數組
        if(File.Exists(path))
            return File.ReadAllBytes(path);
        else
        {
            Debug.Log("未找到路徑文件");
            return null;
        }
    }
    #endregion

    #region Public Function
    
    public void Free()
    {
        luaEnv.Dispose();
        instance = null;
    }

    public object[] DoString(string fileName)
    {
        return luaEnv.DoString($"require('{fileName}')");
    }

    public LuaTable Golbal()
    {
        return luaEnv.Global;
    }
    
    #endregion
}


免責聲明!

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



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