XLua是腾讯研发的Lua开源插件。
传送门:https://pan.baidu.com/s/1JS6niLkBoSFh95jnkta6kQ
建议去官方上下载:https://github.com/Tencent/xLua
关于加载:
XLua有它自己的加载器,它会调用所有的加载器去尝试加载,如果有一个成功了那就不继续加载了,如果都没成功那就报找不到的异常。
加载方式如下:
LuaEnv.DoString("require'Main'");
以上代码,XLua自己的加载器中有一个加载器会去加载Resources目录下的Main.lua.txt文件。
注意哦!是.txt文件,虽然内容是lua内容,但文件不是.lua文件。这是因为Unity的Resources是识别不了.lua文件的,而官方的这个加载器会去依赖于Resources,因此官方要求将.lua文件改为.lua.txt文件。
并且,即使只让Main.lua.txt文件是.txt文件,Main中引入别的.lua文件也是不行的。必须都是.txt文件。
这就有点难受了,总不能拿记事本编写Lua脚本吧!还好官方允许用户自定义加载器,这样我们就可以根据自己的需求来定制自己的加载器了。而且在XLua调用加载器的时候,会优先调用用户自定义的加载器。
关于使用
我们知道Lua语言中,最核心的数据结构就Table,甚至可以用Table来模拟面向对象的特性。因此在通过C#来使用Lua的时候,需要将Lua中的Table结构映射到C#中。可以是class、struct、interface...但官方建议是interface。并且C#映射的数据结构定义的时候必须带有[CSharpCallLua]特性。
映射方式如下:
ITest luaTable = m_LuaEnv.Global.Get<ITest>("Test");
以上代码就将Lua中的Test表,映射到了C#中的ITest接口上。在C#中只需要采取调用接口的方式,就能调用到Lua代码。
参考代码如下:
Lua
Main.lua
require("Test/Test")
Test.Lua
Test={}
function Test:Change(renderer)
renderer.material.color=CS.UnityEngine.Color.red
end
C#
Test.cs
public class Test : MonoBehaviour
{
private LuaEnv m_LuaEnv = null;
private void Start()
{
UpdateLua();
}
private void OnGUI()
{
if (GUILayout.Button("川剧变脸"))
{
ITest luaTable = m_LuaEnv.Global.Get<ITest>("Test");
Renderer renderer = gameObject.GetComponent<Renderer>();
luaTable.Change(renderer);
}
if (GUILayout.Button("更新Lua"))
{
UpdateLua();
}
}
private void UpdateLua()
{
if (m_LuaEnv != null) m_LuaEnv.Dispose();
m_LuaEnv = new LuaEnv();
m_LuaEnv.AddLoader(XLuaLoader.Loader);
m_LuaEnv.DoString("require'Main'");
}
}
[CSharpCallLua]
public interface ITest
{
void Change(Renderer renderer);
}
Tools.cs
public static class Tools
{
public static string GetFolderPath(DirectoryInfo rootFolder, string targetFolderName)
{
Queue<DirectoryInfo> queue = new Queue<DirectoryInfo>();
queue.Enqueue(rootFolder);
DirectoryInfo p;
while (queue.Count > 0)
{
p = queue.Dequeue();
foreach (DirectoryInfo item in p.GetDirectories())
{
if (item.Name == targetFolderName)
return item.FullName;
else
queue.Enqueue(item);
}
}
return null;
}
}
XLuaLoader.cs
public static class XLuaLoader
{
private static string m_LuaScriptsPath = XLuaLoader.GetLuaScriptsPath();
public static byte[] Loader(ref string path)
{
if(m_LuaScriptsPath==null)
throw new Exception("没有找到LuaScripts文件夹");
else
{
try
{
return File.ReadAllBytes(XLuaLoader.GetLuaScriptsPath() + "/" + path + ".lua");
}
catch
{
throw new Exception("LuaScripts文件夹下,不存在:"+path + ".lua文件");
}
}
}
public static string GetLuaScriptsPath()
{
return Tools.GetFolderPath(new DirectoryInfo(Application.dataPath), "LuaScripts");
}
测试效果
1.png
2.png