xLua-C#访问lua中的全局function

https://www.cnblogs.com/herenzhiming/articles/8460854.html

1. 映射到delegate

这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码(如果没生成代码会抛InvalidCastException异常)。
delegate要怎样声明呢?
对于function的每个参数就声明一个输入类型的参数。
多返回值要怎么处理?从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。

  • 无参
void LoadGlobalFun1()
{
    string script = @"
        function fun1()
            print(10+20);
        end    
    ";
	LuaEnv luaEnv = new LuaEnv();
    luaEnv.DoString(script);
    Action fun1 = luaEnv.Global.Get<Action>("fun1");
    fun1();       
}
  • 有参
[CSharpCallLua]
public delegate void FDelegate(int a, string b);
void LoadGlobalFun2()
{
    LuaEnv luaEnv = new LuaEnv();
    string script = @"
        function fun2(a,b)
            print(a);
            print(b)
        end    
    ";
    luaEnv.DoString(script);
    FDelegate fun2 = luaEnv.Global.Get<FDelegate>("fun2");
    fun2(10, "hh");
}
  • 多个返回值
    使用ref 或out 参数接收返回值
public class DClass
{
    public int f1;
    public int f2;
}

[XLua.CSharpCallLua]
public delegate int FDelegate2(int a, string b, out DClass c);

void LoadGlobalFun3()
{
    string script = @"
        function fun3(a, b)
            print('a', a, 'b', b)
            return 1, {f1 = 1024}
        end    
    ";
    luaEnv.DoString(script);
    FDelegate2 fun3 = luaEnv.Global.Get<FDelegate2>("fun3");

    DClass c;
    Debug.Log(fun3(10, "hh",out c));
}
  • 返回值为function时
[CSharpCallLua]
public delegate Action GetE();

void LoadGlobalFun()
{
    string script = @"
        function ret_e()
            print('ret_e called')
            return e
        end
    ";
    GetE ret_e = luaenv.Global.Get<GetE>("ret_e");
    Action e = ret_e();
    e();
}

2. 映射到LuaFunction

这种方式的优缺点刚好和第一种相反。
使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。
两种重载方法:

  • 不指定返回值类型

object[] Call(params object[] args) 描述:
以可变参数调用Lua函数,并返回该调用的返回值。

string script = @"
    function fun(a,b)
        return a+b,a-b
    end
end    
";
luaEnv.DoString(script);

LuaFunction fun = luaEnv.Global.Get<LuaFunction>("fun");
object[] objs = fun.Call(5, 15);
foreach (object obj in objs)
{
    Debug.Log(obj);
}
  • 指定返回值类型

object[] Call(object[] args, Type[] returnTypes) 描述:
调用Lua函数,并指明返回参数的类型,系统会自动按指定类型进行转换

public class DClass
{
    public int f1;
    public int f2;
}
string script = @"
    function fun(a, b)
        print('a', a, 'b', b)
        return 1, {f1 = 6}
    end    
";
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString(script);

LuaFunction fun = luaEnv.Global.Get<LuaFunction>("fun");
object[] objs = fun.Call(new object[] { 11, "sdsd" }, new Type[] { typeof(int), typeof(DClass) });
foreach (object obj in objs)
{
    Debug.Log(obj.GetType());
}
Debug.Log(objs[0]);
Debug.Log((objs[1] as DClass).f1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值