-
Notifications
You must be signed in to change notification settings - Fork 103
Home
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. 导出时必须有这些文件