• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

XLua C#访问Lua文件中一个全局的function 《一》同过映射到delegate访问Lua方法 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

官方文档:

三、访问一个全局的function 仍然是用Get方法,不同的是类型映射。 1、映射到delegate
这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码(如果没生成代码会抛InvalidCastException异常)。
delegate要怎样声明呢? 对于function的每个参数就声明一个输入类型的参数。
多返回值要怎么处理?从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。 2、映射到LuaFunction 这种方式的优缺点刚好和第一种相反。
使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。
四、使用建议 1、访问lua全局数据,特别是table以及function,代价比较大,建议尽量少做,比如在初始化时把要调用的lua
function获取一次(映射到delegate)后,保存下来,后续直接调用该delegate即可。table也类似。
2、如果lua测的实现的部分都以delegate和interface的方式提供,使用方可以完全和xLua解耦:由一个专门的模块负责xlua的初始化以及delegate、interface的映射,然后把这些delegate和interface设置到要用到它们的地方。

调用Lua中无参数的全局方法
    private LuaEnv luaEnv;
    void Start()
    {
        luaEnv = new LuaEnv();//全局唯一
        luaEnv.AddLoader(CustomLoader);//添加自定义路径

        luaEnv.DoString("require '007' ");//在自定义路径中查找007文件

        //方法在类型,在C#中相当于就是个委托类型(delegate)
        Action fun = luaEnv.Global.Get<Action>("init");//映射Lua中的无参数方法init
        fun();//执行C#映射到Lua中的方法
    }


    private byte[] CustomLoader(ref string filepath)
    {
        string path = Application.dataPath + "/Scripts/Xlua/" + filepath + ".lua";//自定义Lua文件路径
        return Encoding.UTF8.GetBytes(File.ReadAllText(path));//返回对应文件的byte[]数据
    }


调用Lua中有参数的全局方法
    private LuaEnv luaEnv;

    void Start()
    {
        luaEnv = new LuaEnv();//全局唯一
        luaEnv.AddLoader(CustomLoader);//添加自定义路径

        luaEnv.DoString("require '007' ");//在自定义路径中查找007文件
                                          //方法在类型,在C#中相当于就是个委托类型(delegate)
                                          //Action fun = luaEnv.Global.Get<Action>("init");//映射Lua中的无参数方法init
                                          //fun();//执行C#映射到Lua中的方法
                                          //=============================================================
      //调用有参数有返回值的Lua方法,多少个返回值,就定义多少out或者ref返回值接收
      //需要自己定义委托来映射的对应的方法,并且需要加上  [CSharpCallLua]标签
        add luaaddfunc = luaEnv.Global.Get<add>("add");//执行Lua中有参数但是没有返回值得方法
        luaaddfunc(20, 30);
    }
    [CSharpCallLua]//要调用Lua中的方法需要添加这个标签
    public delegate void add(int a, int b);
    private byte[] CustomLoader(ref string filepath)
    {
        string path = Application.dataPath + "/Scripts/Xlua/" + filepath + ".lua";//自定义Lua文件路径
        return Encoding.UTF8.GetBytes(File.ReadAllText(path));//返回对应文件的byte[]数据
    }


调用Lua中有参数有并且只有一个返回值的方法,直接接受返回就可以,也可以用out,ref关键字接受
    private LuaEnv luaEnv;

    void Start()
    {
        luaEnv = new LuaEnv();//全局唯一
        luaEnv.AddLoader(CustomLoader);//添加自定义路径

        luaEnv.DoString("require '007' ");//在自定义路径中查找007文件

        //调用有参数有返回值的Lua方法,多少个返回值,就定义多少out或者ref返回值接收
        //需要自己定义委托来映射的对应的方法,并且需要加上  [CSharpCallLua]标签
        addonereturn addreturn = luaEnv.Global.Get<addonereturn>("addonereturn");
        //有一个返回值的时候,可以直接返会
        string return1 = addreturn(20, 30);
        Debug.Log("return1:[" + return1 + "]  ");
    }

    [CSharpCallLua]//有多个返会值的时候//要调用Lua中的方法需要添加这个标签
    public delegate string addonereturn(int a, int b);

    private byte[] CustomLoader(ref string filepath)
    {
        string path = Application.dataPath + "/Scripts/Xlua/" + filepath + ".lua";//自定义Lua文件路径
        return Encoding.UTF8.GetBytes(File.ReadAllText(path));//返回对应文件的byte[]数据
    }


调用Lua中有参数有多个返回值的全局方法 out关键字

    private LuaEnv luaEnv;

    void Start()
    {
        luaEnv = new LuaEnv();//全局唯一
        luaEnv.AddLoader(CustomLoader);//添加自定义路径

        luaEnv.DoString("require '007' ");//在自定义路径中查找007文件
                                          //方法在类型,在C#中相当于就是个委托类型(delegate)
                                          //Action fun = luaEnv.Global.Get<Action>("init");//映射Lua中的无参数方法init
                                          //fun();//执行C#映射到Lua中的方法
                                          //=============================================================
      //调用有参数有返回值的Lua方法,多少个返回值,就定义多少out或者ref返回值接收
      //需要自己定义委托来映射的对应的方法,并且需要加上  [CSharpCallLua]标签
        //add luaaddfunc = luaEnv.Global.Get<add>("add");//执行Lua中有参数但是没有返回值得方法
        //luaaddfunc(20, 30);

        int return1;
        int return2;
        int return3;
        string return4;
        addreturn addreturn = luaEnv.Global.Get<addreturn>("addreturn");
        //执行Lua中有参数但是有多个返回值得方法
        //有一个返回值的时候,可以直接返会
        addreturn(20, 30,out return1,out return2,out return3,out return4);
        Debug.Log("return1:["+return1+ "]  return2:[" + return2+ "]  return3:[" + return3+ "]  return4:[" + return4+"]");
    }
    [CSharpCallLua]//有多个返会值的时候
    public delegate void addreturn(int a, int b,out int return1, out int return2, out int return3,out string return4);

    [CSharpCallLua]//要调用Lua中的方法需要添加这个标签
    public delegate void add(int a, int b);

    private byte[] CustomLoader(ref string filepath)
    {
        string path = Application.dataPath + "/Scripts/Xlua/" + filepath + ".lua";//自定义Lua文件路径
        return Encoding.UTF8.GetBytes(File.ReadAllText(path));//返回对应文件的byte[]数据
    }


调用Lua中有参数有多个返回值的全局方法 ref关键字
    private LuaEnv luaEnv;

    void Start()
    {
        luaEnv = new LuaEnv();//全局唯一
        luaEnv.AddLoader(CustomLoader);//添加自定义路径

        luaEnv.DoString("require '007' ");//在自定义路径中查找007文件
    
      //调用有参数有返回值的Lua方法,多少个返回值,就定义多少out或者ref返回值接收
      //需要自己定义委托来映射的对应的方法,并且需要加上  [CSharpCallLua]标签
        int return1=0;
        int return2=0;
        int return3=0;
        string return4="";
        addreturnref addreturn = luaEnv.Global.Get<addreturnref>("addreturn");
        //执行Lua中有参数但是有多个返回值得方法
        //有一个返回值的时候,可以直接返会
        addreturn(20, 30, ref return1, ref return2, ref return3, ref return4);
        Debug.Log("return1:["+return1+ "]  return2:[" + return2+ "]  return3:[" + return3+ "]  return4:[" + return4+"]");
    }

    [CSharpCallLua]//有多个返会值的时候//要调用Lua中的方法需要添加这个标签
    public delegate void addreturnref(int a, int b, ref int return1, ref int return2, ref int return3, ref string return4);

    private byte[] CustomLoader(ref string filepath)
    {
        string path = Application.dataPath + "/Scripts/Xlua/" + filepath + ".lua";//自定义Lua文件路径
        return Encoding.UTF8.GetBytes(File.ReadAllText(path));//返回对应文件的byte[]数据
    }

执行的结果是一样的


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap