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

xLua 学习笔记

[复制链接]
发表于 2021-8-17 07:44 | 显示全部楼层 |阅读模式
xLua下载

https://github.com/Tencent/xLua




解压后打开Assets目录将文件拖进新工程即可使用


主要函数和用法

C#端:

命名空间引入
  1. using XLua;
复制代码
主要类
  1. LuaEnv luaEnv = new LuaEnv();//最好全局只有一个
复制代码
  1. luaEnv.Dispose();//Lua关闭,一般在程序关闭时调用
复制代码
通过字符串运行Lua
  1. luaEnv.DoString("print('hello world!!!')");
复制代码
加载文件
  1. //添加自定义加载方式
  2. luaEnv.AddLoader(
  3.     (ref string FileName) =>
  4.     {
  5.         string filePath = Application.streamingAssetsPath + "/" + FileName + ".Lua";
  6.         return File.ReadAllBytes(filePath);
  7.     }
  8. );
复制代码
  1. luaEnv.DoString("require 'Lua001'");//lua插件,通过lua语法自己加载文件
复制代码
变量获取
  1. //获取lua里的全局变量
  2. int a = luaEnv.Global.Get<int>("a");
  3. string str = luaEnv.Global.Get<string>("str");
  4. bool bit = luaEnv.Global.Get<bool>("isBit");
复制代码
类型映射
可以像变量一样直接映射到Class,但会更耗性能
推荐是使用接口映射
Lua里的表:
  1. Person = {
  2.     name = 'SDHK',
  3.     age = 100,
  4.      
  5.     eat1 = function(self, a, b) --lua的函数如果要传参,都要有个self将自己传进去,self==this 一个意思
  6.         print((a + b) .. '  SDHK!!!!')
  7.     end
  8. }
  9. function Person:eat(a, b) --这种方式定义函数会默认带一个self参数,代表当前table
  10.     print((a + b) .. '  SDHK????')
  11. end
复制代码
C#映射代码:
  1. //接口映射 是 引用映射,这种方式依赖于生成代码,如果set属性也会设置对应的字段。甚至可以通过interface的方法访问lua的函数。
  2. [CSharpCallLua]//用接口映射Lua表 需要加上这个特性,否则会报错
  3. interface IPerson   
  4. {
  5.     string name { get; set; } //接口只能写函数
  6.     int age { get; set; }
  7.     void eat(int a, int b);
  8. }
复制代码
  1. IPerson p = luaEnv.Global.Get<IPerson>("Person");//推荐
  2. print(p.name + ":" + p.age);
复制代码
轻量级映射

字典映射:
  1. Dictionary<string, object> dict = luaEnv.Global.Get<Dictionary<string, object>>("Person");
  2. foreach (var key in dict.Keys)  //只映射出键值对
  3. {
  4.     Debug.Log(key + ":" + dict[key]);
  5. }
复制代码
List映射:
  1. List<object> list = luaEnv.Global.Get<List<object>>("Person");//只映射下标类型
  2. foreach (var item in list)
  3. {
  4.     Debug.Log(item);
  5. }
复制代码
LuaTable映射
消耗比较高
  1. //这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。
  2. LuaTable tab = luaEnv.Global.Get<LuaTable>("Person");//消耗比较高
  3. Debug.Log(tab.Get<string>("name"));
  4. Debug.Log(tab.Get<int>("age"));
  5. foreach (var item in tab.GetKeys())
  6. {
  7.     Debug.Log(item);
  8. }
复制代码
函数映射

直接映射
Lua里的函数:
  1. function add(a, b) --纯函数映射
  2.     print(a + b)
  3.     return a + b
  4. end
复制代码
C#映射代码:
  1. [CSharpCallLua]//纯函数映射需要单独写委托和特性
  2. delegate int add(int a, int b);
  3. void Start()
  4. {
  5.     add add = luaEnv.Global.Get<add>("add");//纯函数映射
  6.     print(add(1, 2));
  7.     add = null;//手动释放引用,不然Lua关闭时会报错
  8. }
复制代码
函数LuaFunction映射,代价比较大
  1. LuaFunction func = luaEnv.Global.Get<LuaFunction>("add");
  2. print(func.Call(1, 2)[0]);
复制代码
Lua端:

函数方法调用
  1. --调用u3d C# 方法,没有new,需要写全命名空间
  2. CS.UnityEngine.GameObject('newLua')
  3. --调用C#静态方法
  4. print('访问静态' .. CS.UnityEngine.Time.deltaTime)
复制代码
获取物体
  1. local Box = CS.UnityEngine.GameObject.Find('newLua')
  2. Box.name = 'Box'
复制代码
获取组件和属性
  1. Box:AddComponent(typeof(CS.UnityEngine.UI.Text))--CS添加组件
  2. local text1 = Box:GetComponent('Text')--CS获取组件
  3. text1.text = 'Lua写入'  
  4. --类型获取可以直接调用typeof
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 12:01 , Processed in 0.128896 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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