您的位置:首页 > 编程语言 > Lua

xLua自定义加载器

2021-10-09 18:11 1271 查看

xLua入门基础

环境配置

github下载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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: