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
}