找回密码
 立即注册
查看: 299|回复: 0

XLua之CSharpCallLua

[复制链接]
发表于 2021-8-13 13:26 | 显示全部楼层 |阅读模式
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.将表映射到结构体中,和类的映射相似。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-2 04:02 , Processed in 0.086643 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表