为什么使用 puerts 及 puerts 在项目中的使用、TS理解
一、首先要知道什么是puerts?
puerts提供了通过TypeScript访问宿主引擎的能力(如通过ts语言可以获取到gameobject身上的组件),相比于lua脚本,typeScript的静态类型检查有助于更好地去编写代码。高效(全引擎,全平台支持反射binding,无需额外生成代码)、高性能(全引擎,全平台支持静态binding)
1、关于puerts里的c#标签介绍:
- Configure:配置类,只能用于类上,且在Editor文件夹下;
- Binding:在 js/ts 调用的时候,可以找到该类(会生成一个静态类,在js调用时,直接静态调用,加快调用速度,否则是通过反射调用)(在index.d.ts中生成函数的声明,在ts调用时,import时可以找到)。该标签只能用在属性,并且需要放在标记了Configure的类里;
- Typeing:仅针对TS调用,相比于Binding,该标签仅生成ts声明(即不会生成静态类,只会在index.d.ts中生成函数的声明给ts调用)。该标签仅用于属性上,并且在标记了Configure的类里。
- BlittableCopy:对Blittable值类型通过内存拷贝传递,可避免值类型传递产生的GC,需要开启unsafe编译选项。该标签仅用于属性上,并且在标记了Configure的类里。
- Filter:过滤函数。该标签只能用在函数上,并且在标记了Configure的类里。
2、关于puerts的4大突破点:
带静态类型检查的脚本;拷贝即可使用,无需生成胶水代码(使不兼容程序或部分组合起来);基于指针的Blittable结构体GC优化;跨语言异步(TypeScript的async方法可以await C#的async方法)
二、puerts在项目中有什么好处?具体使用是什么?
1、关于puerts在项目中的好处:
Unity+Puerts实现JsBehaviour,主要是通过JsBehaviour实现对GameObject和组件的引用以及提供可编辑的参数,实现资源和代码更好的解耦。
2、个人的具体使用过程:
我在写JsBehaviour中,通过深度遍历获得子结点,比较子结点和我定义好的前缀信息(将配置文件移动到Editor/Puerts文件夹下,通过配置字段来支持跨DLL使用)相比较,相同的则收集该结点信息。通过正则表达式将这些收集到的组件规范化书写在TS文件里,如果无文件,则要先生成TS文件(分为Mono.ts和Ctrl.ts)。利用cmd命令行,在unity中点击按钮会传入Ts文件的地址,直接在vscode中打开,提高开发效率。
补充说明:配置文件此处是以字典的形式写入数据,通过打在类和属性上的标签(标签可以自定义),做到可以在dll域中找到这些数据,返回回去(找数据的功能可以封装成一个方法,这个类可以不在Editor文件夹下,但配置文件需要在Assets/App/Editor文件夹下)。此外Mono.ts作页面显示处理,Ctrl.ts作数据处理,l实现数据和显示分离。
三、V8(c++开发)和QuickJS(基于C实现) 同 node.js(基于Chrome V8引擎的JavaScript运行环境)一样吗?
1、V8: 稳定性是最主要的因素,程序稳定了,才能考虑其它的,v8已经在chrome浏览器各平台经过了无数人的蹂躏和无数时间的考验。况且它的性能也十分优秀。
2、quickjs:除了体积小并没有太多特别的地方。
3、node.js:是js的运行环境,V8是node.js内的JavaScript引擎,用于解析和运行JavaScript。如果没有V8,当前的node.js二进制文件将无法进行运行,因为没有JavaScript引擎也就没有能力运行JavaScript代码,node.js也可以理解为浏览器的作用,Chrome内部使用了V8,所以可以在浏览器中运行JavaScript。
四、对于TS的个人理解:
1、有两个特点
① 强类型语言
② 基于类的面向对象编程
2、有两个好处
① 支持静态类型检查
② 有良好的生态:包括工具链,库,文档
3、个人理解总结
TS最好的地方就是它即是动态语言,却也能带来静态语言的使用体验,出现错误能够尽早发现。
4、相关说明
动态语言:是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。如JavaScript
var s = "string";
var n = "number";
var b = "boolean"
静态语言:是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须声明数据类型。如C#
String s = "string";
int n = "int";
boolean b = "boolean";
弱类型语言:数据类型可以被忽略的语言。一个变量可以赋不同数据类型的值。一个变量的类型是由其上下文决定的,效率更高。
强类型语言:必须强制确定数据类型的语言,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这种数据类型,不允许隐式的类型转换。一个变量的类型是申明的时候就已经确定的,更安全。