简单的XLua使用

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。