## 特性

### 总体

- Lua虚拟机支持
  - Lua5.3.3
  - Luajit2.1beta2
- Unity3D版本支持
  - Unity5
  - Unity4
- 平台支持
  - windows 64/32
  - android
  - ios 64/32/bitcode
  - osx
- 互访技术
  - 生成适配代码
  - 反射
- 易用性
  - 解压即可用
  - 开发期无需生成代码
  - 生成代码和反射间可无缝切换
  - 更简单的无GC api
  - 菜单简单易懂
  - 配置可以多份，按模块划分，也可以直接在目标类型上打Attribute标签
  - 自动生成link.xml防止代码剪裁
  - Plugins部分采用cmake编译，更简单
  - 核心代码不依赖生成代码，可以随时删除生成目录
- 性能
  - Lazyload技术，避免用不上的类型的开销
  - lua函数映射到c# delegate，lua table映射到interface，可实现接口层面无C# gc alloc开销
  - 所有基本值类型，所有枚举，字段都是值类型的struct，在Lua和C#间传递无C# gc alloc
  - LuaTable，LuaFunction提供无gc访问接口
  - 通过代码生成期的静态分析，生成最优代码
  - 支持C#和Lua间指针传递
  - 自动解除已经Destroy的UnityEngine.Object的引用
- 扩展性
  - 不用改代码就可以加入Lua第三方扩展
  - 生成引擎提供接口做二次开发

### 支持为如下C#实现打补丁

- 构造函数
- 析构函数
- 成员函数
- 静态函数
- 泛化函数
- 操作符重载
- 成员属性
- 静态属性
- 事件

### Lua代码加载

- 加载字符串
  - 支持加载后立即执行
  - 支持加载后返回一个delegate或者LuaFunction，调用delegate或者LuaFunction后可传脚本参数
- Resources目录的文件
  - 直接require
- 自定义loader
  - Lua里头require时触发
  - require参数透传给loader，loader读取Lua代码返回
- Lua原有的方式
  - Lua原有的方式都保留

### Lua调用C

- 创建C#对象
- C#静态属性，字段
- C#静态方法
- C#成员属性，字段
- C#成员方法
- C#继承
  - 子类对象可以直接调用父类的方法，访问父类属性
  - 子类模块可以直接调用父类的静态方法，静态属性
- 扩展方法（Extension methods）
  - 就像普通成员方法一样使用
- 参数的输入输出属性（out，ref）
  - out对应一个lua返回值
  - ref对应一个lua参数以及一个lua返回值
- 函数重载
  - 支持重载
  - 由于lua数据类型远比C#要少，会出现无法判断的情况，可通过扩展方法来来调用。
- 操作符重载
  - 支持的操作符：+，-，*，/，==，一元-，<，<=， %，[]
  - 其它操作符可以借助扩展方法调用
- 参数默认值
  - C#参数有默认值，在lua可以不传
- 可变参数
  - 在对应可变参数部分，直接输入一个个参数即可，不需要把这些参数扩到一个数组里头
- 泛化方法调用
  - 静态方法可以自行封装使用
  - 成员函数可通过扩展方法封装使用
- 枚举类型
  - 数字或字符串到枚举的转换
- delegate
  - 调用一个C# delegate
  - +操作符
  - -操作符
  - 把一个lua函数作为一个c# delegate传递给c#
- event
  - 增加事件回调
  - 移除事件回调
- 64位整数
  - 传递无gc而且无精度损失
  - lua53下使用原生64位支持
  - 可以和number运算
  - 以java的方式支持无符号64位整数
- table的自动转换到C#复杂类型
  - obj.complexField = {a = 1, b = {c = 1}}，obj是一个C#对象，complexField是两层嵌套的struct或者class
- typeof
  - 对应C#的typeof操作符，返回Type对象
- lua侧直接clone
- decimal
  - 传递无gc而且无精度损失

### C#调用Lua

- 调用Lua函数
  - 以delegate方式调用Lua函数
  - 以LuaFunction调用lua函数
- 访问Lua的table
  - LuaTable的泛化Get/Set接口，调用无gc，可指明Key，Value的类型
  - 用标注了CSharpCallLua的interface访问
  - 值拷贝到struct，class

### Lua虚拟机

- 虚拟机gc参数读取及设置

### 工具链

- Lua Profiler
  - 可根据函数调用总时长，平均每次调用时长，调用次数排序
  - 显示lua函数名及其所在文件的名字及行号
  - 如果C#函数，会显示这个是C#函数
- 支持真机调试