Skip to content
topameng edited this page Jun 18, 2015 · 12 revisions

1. 性能就不说。诞生的目的就是100%用lua写代码

  • 使用lua版的 LookRotation 比c#的还要快,测试pc上快了一倍多。推测原因是: 1. luajit对数值计算提升很强。2. c# 四元数进行了跨语言调用。 如果可以直接注册c++对象,一定比c#跑的还快

2. 可以扩展操作符函数到lua中. 包括为委托函数自定义了 +,- 操作符. 实际代码示例如下:

  • local node = FindNode(self.transform, "BtnGo")
  • local go = node.gameObject
  • local ev = go:GetComponent(UIEventListener.GetClassType())
  • local func = function() print("测试委托 + ") end
  • ev.onClick = func
  • local func = function() print("测试委托2 ") end
  • ev.onClick = ev.onClick + func

3. 更好的控制c#函数可见性, 对于废弃的函数,私有函数都不会导出.

  • 也可以自己配置添加或者删除函数(比如给object对象加了Destroy函数。在u3d Destroy里面加了gc调用)

4. 更快的回收内存, 一个Object.Destroy调用后就从c#端删除了对象。避免 gc 缓慢,交叉等等问题.

  • 例如如下代码,在第三行调用要能把gameObject 为nil信息报出来。对于反射(甚至c#)无法实现这个特性
  • 因为 unity 延迟删除的特性,其实真的GameObject还没有删除,c# 这样写也不会报错。 而我们写逻辑其实希望这种问题能够提前暴露出来.
  • local newGameObj = GameObject.New('NewObj')
  • Object.Destroy(newGameObj) -- 这里也可以采用 newGameObject:Destroy() 方式调用
  • newGameObj:AddComponent(SkinnedMeshRenderer.GetClassType())

5. 可以支持数组参数。可以在lua端用table传递传递数组参数。

  • 对可变参数列表采用原生支持,无需使用Table。 可变参数例如 Debugger.Log(1,2,3)

6. 处理二义性。如lua number参数类型可以对应很多c#函数,自动参数选取范围最大的函数

  • 比如System.Convert(65536) 不会把一个lua number 给匹配到 char 字符上去。 对于lua 来说有 void Test(char a) 和 void Test(double a) 2个重载函数,只能把第二个注册给lua, 因为lua只有double。

7. 支持重载函数, 并且排序函数对于,相同参数个数, object 参数比较会放在后面,避免object可以匹配任意类型,对于可变参数数组会放在最后面

  • 无论对于u3d还是其他第三方库,有通配类型object的不少。甚至既有 object 又有 object 的可变参数这样的重载函数组合 参见override example

8. u3d类型为null检测. 对于已经为空的 unity object 进行提示。不包括lua主动传递的nil参数(确保当传递nil时,是自己确实想置null).

  • 对于第几个参数以及参数类型进行错误提示,而不是针对整个函数提示,对于排错是十分有益的。工程中发现总是挡不住有人写很长的串式比如:
    
  • FindNode(self.transform,"Btn").gameObject:GetComponent(UIWidget.GetClassType()).  
    
  • 虽然可以编码规范来杜绝这种行为,更好的方式是即使出错也能直接提示到精确位置。对于单一函数调用,知道那个参数错误,对于排错速度也是大大有益的
    
  • 对于c#代码异常,如果是lua调用触发,会报出异常信息,这种出错信息可能会比较宽泛
    

9. 严格区分枚举类型和int值,避免造成某些u3d重载函数混淆.

  • 比如 Transform:Rotate(vec, 0) 和 Transform:Rotate(vec, Space.World)

10. 支持导出模板类。可以作为自定义类型导出到lua中

  • 并且可以修改导出类型名称

11. 原生支持protobuffer(采用proto-gen-lua方案).

  • 从服务器接收的pb协议字节流可以作为LuaStringBuffer传递到lua中,lua中直接解包获。lua中打包的协议也可以作为LuaStringBuffer传递到c#, c#取byte[] 数组发送到服务器
  • 可参考 protobuffer example

12. 可以修改导出行为。参见Editor/Wrap下特写写法

  • 比如ToLua_System_String. 导出时必须有这些文件
Clone this wiki locally