xLua自定义加载器
xLua入门基础
环境配置
xLua是腾讯开发,据说比较先进;
下载下来后将Plugins和XLua文件夹考进项目;
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;
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
}
Life is too short for so much sorrow.
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自 小紫苏!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)