|
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) end4.将表映射到结构体中,和类的映射相似。 |
|