zhaoww 发表于 2021-1-8 21:57

请试用一下js脚本插件

本帖最后由 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.jsconst 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 coroutineasync 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上编的,并没有跑过,如果不能运行请回复一下。另外这个是个人开发并没有经过良好测试,希望大家能帮忙测试一下。项目地址
页: [1]
查看完整版本: 请试用一下js脚本插件