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
}
posted @ 2021-10-09 18:11  小紫苏  阅读(921)  评论(0编辑  收藏  举报