|
xLua下载
https://github.com/Tencent/xLua
解压后打开Assets目录将文件拖进新工程即可使用
主要函数和用法
C#端:
命名空间引入
主要类
- LuaEnv luaEnv = new LuaEnv();//最好全局只有一个
复制代码- luaEnv.Dispose();//Lua关闭,一般在程序关闭时调用
复制代码 通过字符串运行Lua
- luaEnv.DoString("print('hello world!!!')");
复制代码 加载文件
- //添加自定义加载方式
- luaEnv.AddLoader(
- (ref string FileName) =>
- {
- string filePath = Application.streamingAssetsPath + "/" + FileName + ".Lua";
- return File.ReadAllBytes(filePath);
- }
- );
复制代码- luaEnv.DoString("require 'Lua001'");//lua插件,通过lua语法自己加载文件
复制代码 变量获取
- //获取lua里的全局变量
- int a = luaEnv.Global.Get<int>("a");
- string str = luaEnv.Global.Get<string>("str");
- bool bit = luaEnv.Global.Get<bool>("isBit");
复制代码 类型映射
可以像变量一样直接映射到Class,但会更耗性能
推荐是使用接口映射
Lua里的表:- Person = {
- name = 'SDHK',
- age = 100,
-
- eat1 = function(self, a, b) --lua的函数如果要传参,都要有个self将自己传进去,self==this 一个意思
- print((a + b) .. ' SDHK!!!!')
- end
- }
- function Person:eat(a, b) --这种方式定义函数会默认带一个self参数,代表当前table
- print((a + b) .. ' SDHK????')
- end
复制代码 C#映射代码:- //接口映射 是 引用映射,这种方式依赖于生成代码,如果set属性也会设置对应的字段。甚至可以通过interface的方法访问lua的函数。
- [CSharpCallLua]//用接口映射Lua表 需要加上这个特性,否则会报错
- interface IPerson
- {
- string name { get; set; } //接口只能写函数
- int age { get; set; }
- void eat(int a, int b);
- }
复制代码- IPerson p = luaEnv.Global.Get<IPerson>("Person");//推荐
- print(p.name + ":" + p.age);
复制代码 轻量级映射
字典映射:- Dictionary<string, object> dict = luaEnv.Global.Get<Dictionary<string, object>>("Person");
- foreach (var key in dict.Keys) //只映射出键值对
- {
- Debug.Log(key + ":" + dict[key]);
- }
复制代码 List映射:- List<object> list = luaEnv.Global.Get<List<object>>("Person");//只映射下标类型
- foreach (var item in list)
- {
- Debug.Log(item);
- }
复制代码 LuaTable映射
消耗比较高- //这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。
- LuaTable tab = luaEnv.Global.Get<LuaTable>("Person");//消耗比较高
- Debug.Log(tab.Get<string>("name"));
- Debug.Log(tab.Get<int>("age"));
- foreach (var item in tab.GetKeys())
- {
- Debug.Log(item);
- }
复制代码 函数映射
直接映射
Lua里的函数:- function add(a, b) --纯函数映射
- print(a + b)
- return a + b
- end
复制代码 C#映射代码:- [CSharpCallLua]//纯函数映射需要单独写委托和特性
- delegate int add(int a, int b);
- void Start()
- {
- add add = luaEnv.Global.Get<add>("add");//纯函数映射
- print(add(1, 2));
- add = null;//手动释放引用,不然Lua关闭时会报错
- }
复制代码 函数LuaFunction映射,代价比较大- LuaFunction func = luaEnv.Global.Get<LuaFunction>("add");
- print(func.Call(1, 2)[0]);
复制代码 Lua端:
函数方法调用
- --调用u3d C# 方法,没有new,需要写全命名空间
- CS.UnityEngine.GameObject('newLua')
- --调用C#静态方法
- print('访问静态' .. CS.UnityEngine.Time.deltaTime)
复制代码 获取物体
- local Box = CS.UnityEngine.GameObject.Find('newLua')
- Box.name = 'Box'
复制代码 获取组件和属性
- Box:AddComponent(typeof(CS.UnityEngine.UI.Text))--CS添加组件
- local text1 = Box:GetComponent('Text')--CS获取组件
- text1.text = 'Lua写入'
- --类型获取可以直接调用typeof
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|