|
本帖最后由 zhaoww 于 2021-1-8 22:18 编辑
最近有点想法想做点东西又把unity拿出来学了一下(以前做过大概两年unity),然后脚本插件部分了解了一下貌似lua比较多,但是lua比较难写而且工具较少,另外还有个quickjs插件给了我灵感,原来quickjs已经发展到这个地步了,支持es6还支持符号重载。以前一直都用v8或者ios上的javascriptcore,但是看了插件的实现上和我的理念还是有点不合,所以自己写一个。
介绍一下特性:
1,动态注册类型支持任何类型.
cs中注册- quickJS.RegisterClass<Vector3>();
复制代码 js中调用- const Vector3 = unity('UnityEngine.Vector3');
复制代码 当然如果没有注册,也能动态查找,不过会慢一点点。另外提前注册可以跑一段editor脚本来生成代码,这段代码会让编译器以为这个类的所有方法都会被调用,免得编译时没编译到,导致脚本中调用不到。
2,性能强劲,Demo HelloWorld中有一段性能测试,c#中调用js方法和纯js运算都比xlua快一倍以上。
3,对MonoBehaviour的支持。
UI和添加自定义属性基本与原生MonoBehaviour一致
simple.js - const MonoBehaviour = unity("UnityEngine.MonoBehaviour");
- const FieldType = unity("qjs.FieldType");
- const Vector3 = unity("UnityEngine.Vector3");
- class A extends MonoBehaviour {
- constructor() {
- super(...arguments);
- this.addField("test4", FieldType.Vector3, vec3(1, 2));
- }
- Start() {
- this.transform.position = this.test4;
- }
- Update() {
- var vec = this.transform.position;
- vec += vec3(0.01, 0, 0);
- this.transform.position = vec;
- }
- };
- export default A;
复制代码 4, 支持asar归档文件
asar是electron使用的归档格式,可以方便的把npm项目导入unity项目中. asar项目链接
5,支持npm库
在configure中配置好的asar包和js文件都会加入到环境中,然后即可用import或者require导入了。
现在即可在使用环境中有的纯js npm库了。- const md5 = require('md5');
- console.log(md5('hello'));
复制代码 6,同时支持require和import.
7, 支持await coroutine- async Start() {
- console.log("before coroutine");
- await new WaitForSeconds(3);
- console.log("after coroutine");
复制代码 8,支持c# delegate 与 js function 自由转换。
会根据delegate和function的参数量来匹配,数量相等的会优先匹配。- let thread = new Thread(function () {
- console.log("In " + Thread.CurrentThread.Name);
- });
- thread.Name = "SubThread";
- thread.Start();
复制代码 9,支持Worker
上面的代码中虽然使用了thread但是同一个环境中的js还是会锁住线程的,所以并不是真正的多线程。要使用真正的多线程必须使用Worker.
10,js 中的基础运算
我们可以直接使用 c#中的Vector等来做向量运算,也可以使用纯js实现的vec来做向量运算。不仅更方便更重要的是纯js实现会减少一半左右的运算时间。- this.transform.position += vec3(0.01, 0, 0);
复制代码 11,自定义类型转换
实现toUnity方法即可在传递给c#的时候自动做出类型转换,上面的例子中vec3被自动转化为了Vector3类型即是使用这个特性。- const Vector3 = unity('UnityEngine.Vector3');
- vec3.prototype.toUnity = ()=>new Vector3(...this.m);
复制代码 12,Editor工具
提供一些便捷工具:
1,创建js脚本
2,创建Configure
3,生成伪调用文件,让编译器认为会被调用。
处理在Configure中注册的类型- public override void OnRegisterClass(Action<Type, HashSet<string>> RegisterClass)
- {
- RegisterClass(typeof(WaitForSeconds), null);
- RegisterClass(typeof(Thread), new HashSet<string> { "CurrentContext" });
- }
复制代码 在这个Configure的Inspector中点击 Process register 即可生成伪调用文件。
然后,windows版本是我在surface上编的,并没有跑过,如果不能运行请回复一下。另外这个是个人开发并没有经过良好测试,希望大家能帮忙测试一下。 项目地址 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|