找回密码
 立即注册
查看: 840|回复: 0

[试用插件] 请试用一下js脚本插件

[复制链接]
发表于 2021-1-8 21:57 | 显示全部楼层 |阅读模式
本帖最后由 zhaoww 于 2021-1-8 22:18 编辑

最近有点想法想做点东西又把unity拿出来学了一下(以前做过大概两年unity),然后脚本插件部分了解了一下貌似lua比较多,但是lua比较难写而且工具较少,另外还有个quickjs插件给了我灵感,原来quickjs已经发展到这个地步了,支持es6还支持符号重载。以前一直都用v8或者ios上的javascriptcore,但是看了插件的实现上和我的理念还是有点不合,所以自己写一个。

介绍一下特性:
1,动态注册类型支持任何类型.

cs中注册
  1. quickJS.RegisterClass<Vector3>();
复制代码
js中调用
  1. const Vector3 = unity('UnityEngine.Vector3');
复制代码
当然如果没有注册,也能动态查找,不过会慢一点点。另外提前注册可以跑一段editor脚本来生成代码,这段代码会让编译器以为这个类的所有方法都会被调用,免得编译时没编译到,导致脚本中调用不到。

2,性能强劲,Demo HelloWorld中有一段性能测试,c#中调用js方法和纯js运算都比xlua快一倍以上。

3,对MonoBehaviour的支持。

   UI和添加自定义属性基本与原生MonoBehaviour一致


  simple.js
  1. const MonoBehaviour = unity("UnityEngine.MonoBehaviour");
  2. const FieldType = unity("qjs.FieldType");
  3. const Vector3 = unity("UnityEngine.Vector3");

  4. class A extends MonoBehaviour {
  5.   constructor() {
  6.     super(...arguments);
  7.     this.addField("test4", FieldType.Vector3, vec3(1, 2));
  8.   }

  9.   Start() {
  10.     this.transform.position = this.test4;
  11.   }

  12.   Update() {
  13.     var vec = this.transform.position;
  14.     vec += vec3(0.01, 0, 0);
  15.     this.transform.position = vec;
  16.   }
  17. };

  18. export default A;
复制代码
4, 支持asar归档文件

asar是electron使用的归档格式,可以方便的把npm项目导入unity项目中. asar项目链接

5,支持npm库

在configure中配置好的asar包和js文件都会加入到环境中,然后即可用import或者require导入了。

现在即可在使用环境中有的纯js npm库了。
  1. const md5 = require('md5');

  2. console.log(md5('hello'));
复制代码
6,同时支持require和import.
7, 支持await coroutine
  1. async Start() {
  2.   console.log("before coroutine");
  3.   await new WaitForSeconds(3);
  4.   console.log("after coroutine");
复制代码
8,支持c# delegate 与 js function 自由转换。
会根据delegate和function的参数量来匹配,数量相等的会优先匹配。
  1. let thread = new Thread(function () {
  2.   console.log("In " + Thread.CurrentThread.Name);
  3. });
  4. thread.Name = "SubThread";
  5. thread.Start();
复制代码
9,支持Worker
上面的代码中虽然使用了thread但是同一个环境中的js还是会锁住线程的,所以并不是真正的多线程。要使用真正的多线程必须使用Worker.
10,js 中的基础运算
我们可以直接使用 c#中的Vector等来做向量运算,也可以使用纯js实现的vec来做向量运算。不仅更方便更重要的是纯js实现会减少一半左右的运算时间。
  1. this.transform.position += vec3(0.01, 0, 0);
复制代码
11,自定义类型转换
实现toUnity方法即可在传递给c#的时候自动做出类型转换,上面的例子中vec3被自动转化为了Vector3类型即是使用这个特性。
  1. const Vector3 = unity('UnityEngine.Vector3');
  2. vec3.prototype.toUnity = ()=>new Vector3(...this.m);
复制代码
12,Editor工具
提供一些便捷工具:
  1,创建js脚本

  2,创建Configure

  3,生成伪调用文件,让编译器认为会被调用。
    处理在Configure中注册的类型
  1. public override void OnRegisterClass(Action<Type, HashSet<string>> RegisterClass)
  2.     {
  3.   RegisterClass(typeof(WaitForSeconds), null);
  4.   RegisterClass(typeof(Thread), new HashSet<string> { "CurrentContext" });
  5. }
复制代码
在这个Configure的Inspector中点击 Process register 即可生成伪调用文件。

然后,windows版本是我在surface上编的,并没有跑过,如果不能运行请回复一下。另外这个是个人开发并没有经过良好测试,希望大家能帮忙测试一下。  项目地址

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 12:33 , Processed in 0.116296 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表