请试用一下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]