XLua之CSharpCallLua

1.c#访问lua中的变量

引入Xlua命名空间,定义lua环境变量

 LuaEnv luaenv = new LuaEnv();
 luaenv.DoString("require 'CSharpCallLua'");
 print(luaenv.Global.Get<int>("a"));
 print(luaenv.Global.Get<string>("str"));

get的时候 变量名要正确。

2.将lua中的表映射到c#类中

先定义一个类,里面字段是公开的,不能使用属性。字段名要和lua中的对应

class Person
{
    public int age;
    public string name;
}
 Person pp = luaenv.Global.Get<Person>("Person");
 print(pp.name);

类中有方法的时候,方法映射不成功。

映射到类这个过程是值拷贝,如果class比较复杂代价会比较大。而且修改class的字段值不会同步到table,反过来也不会。

3.下面介绍映射到接口,该过程是引用类型映射。这种方式依赖于生成代码(如果没生成代码会抛InvalidCastException异常)

修改属性值两边都会发生变化。也可以调用其中的方法

接口前要加[CSharpCallLua]前缀

[CSharpCallLua]
interface IPerson
{
    void Eat(string food1, string food2);
    void Study(int a, int b);
}
Person={ 
 age=12,name="Mr"
}

Person.Eat=function(self,str1,str2)
  print("吃"..str1.."和"..str2)
  end

  Person.Study=function(self,a,b)
  print(a+b)
  end
 
 IPerson p = luaenv.Global.Get<IPerson>("Person");
 p.Eat("香蕉", "牛奶");
 p.Study(2, 5);

 在这里要注意的是Lua中的方法的定义。

1.通过 点FunctionName 这种方式定义的含参方法,在调用的时候有一个隐藏参数要传入。如果不在lua中写出这个self参数,

p.Eat("香蕉","牛奶");  此时则会报异常,因为在lua里赋值的时候,第一个参数赋值给了self,第二个参数才赋值给str1.

所以我们一般定义出self这个参数,默认在lua中,把自身传递进去,外界在调用的时候,就不需要额外传入参数。

2.通过:冒号定义的函数

function Person:Eat(str1,str2)
  print("吃"..str1.."和"..str2)
  end

此时则不需要定义出self 参数,外界调用的时候,也不需要额外传入参数。

与下面做区别:

function Person.Eat (self,str1,str2)
  print("吃"..str1..str2)
  end

4.将表映射到结构体中,和类的映射相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值