温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JS Binding跟SharpKit或JavaScript的加载流程是怎样的

发布时间:2021-09-30 09:47:49 来源:亿速云 阅读:141 作者:柒染 栏目:大数据

JS Binding跟SharpKit或JavaScript的加载流程是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

首先,现在的方案是游戏启动就加载全部的 JavaScript 代码。

先看下 StreamingAssets/JavaScript/ 文件夹下的目录结构:

JS Binding跟SharpKit或JavaScript的加载流程是怎样的

  • debug/:跟 JavaScript 调试有关的 JavaScript 代码,只有当开启调试的时候才需要加载。

  • Manual/:也是用于手写 JavaScript 代码,跟 JSImp/ 有一些区别。Manual 里最有的代表性的是 Vector2 和 Vector3,这2个对象是手写实现的,在 JavaScript 中跑只会使用 JavaScript 版本的 Vector2 和 Vector3

  • SharpKit/:从 SharpKit 拿过来的一些 JavaScript 库文件。可以实现类继承等

  • GeneratedFiles.javascript:是由菜单 【JSB | Generate JS and CS Bindings】 产生的。用于实现将 C# 函数绑定到 JavaScript 上。比如说要在 JavaScript 中使用 GameObject 就要使用这里面的文件。这一点和 LUA 不一样,LUA 产生绑定时只有产生 C# 代码,我们是2边都有。

  • SharpKitGeneratedFiles.javascript:由 SharpKit 工程编译而来的 JavaScript 代码都会放在这个文件里。

  • includes.javascript:JavaScript 代码总入口

目前 JavaScript 加载只有一个入口,StreamingAsset/JavaScript/includes.javascript。

查看 _JSEngine.prefab 上的配置:

JS Binding跟SharpKit或JavaScript的加载流程是怎样的

includes.javascript 里面通过 CS.require 包含了所有的 JavaScript 文件:

(此内容可能不是最新的)

1 /*
 2 * Author: Qiucw
 3 * DO NOT change order
 4 */
 5 
 6 
 7 // -1)
 8 //--------------------------------------------------
 9 function jsb_ReplaceOrPushJsType(jst) {
10     //if (!JsTypes) { JsTypes = []; }
11     var found = false;
12     for (var i = 0; i < JsTypes.length; i++) {
13         if (JsTypes[i].fullname == jst.fullname) {
14             JsTypes[i] = jst;
15             found = true;
16             break;
17         }
18     }
19     if (!found) {
20         JsTypes.push(jst);
21     }
22 }
23 
24 
25 // 0) SharpKit library
26 //--------------------------------------------------
27 CS.require("SharpKit/jsclr");
28 CS.require("SharpKit/clrlibrary");
29 
30 // 1) Files generated by JSBinding
31 // may overwrite some classes in step 0)
32 //--------------------------------------------------
33 CS.require("GeneratedFiles");
34 
35 
36 // 2) Manually written js
37 // will overwrite some classes in step 1)
38 //--------------------------------------------------
39 CS.require("Manual/UnityEngine_Vector3");
40 CS.require("Manual/UnityEngine_Vector2");
41 CS.require("Manual/UnityEngine_MonoBehaviour");
42 CS.require("Manual/UnityEngine_WaitForSeconds");
43 CS.require("Manual/MissingClasses");
44 //
45 // may be more..
46 //
47 
48 // 3) code generated by SharpKit
49 //--------------------------------------------------
50 CS.require("SharpKitGeneratedFiles");
51 
52 
53 // 4) JavaScript implemented
54 // will overwrite some classes in step 1)
55 //--------------------------------------------------
56 CS.require("JSImp/Reflection");
57 CS.require("JSImp/Coroutine");
58 CS.require("JSImp/Iterator");
59 
60 //
61 // may be more..
62 //
63 
64 // 5) SharpKit handler (Compile)
65 //--------------------------------------------------
66 CS.require("SharpKit/myclrhandler");
67 
68 // 6) Error handler
69 //--------------------------------------------------
70 CS.require("ErrorHandler");

JavaScript 里的类一开始都是用 JsType 对象来表示,可以打开 StreamingAssets/JavaScript/SharpKitGeneratedFiles.javascript/ 查看一下。这里贴出来 V3Test 这个 MonoBehaviour 的 JavaScript 代码:

1 if (typeof(JsTypes) == "undefined")
 2     var JsTypes = [];
 3 var V3Test = {
 4     fullname: "V3Test",
 5     baseTypeName: "UnityEngine.MonoBehaviour",
 6     assemblyName: "SharpKitProj",
 7     Kind: "Class",
 8     definition: {
 9         ctor: function (){
10             this.elapsed = 0;
11             UnityEngine.MonoBehaviour.ctor.call(this);
12         },
13         Start: function (){
14         },
15         Update: function (){
16             this.elapsed += UnityEngine.Time.get_deltaTime();
17             if (this.elapsed > 1){
18                 var sb = new System.Text.StringBuilder.ctor();
19                 this.elapsed = 0;
20                 var v = new UnityEngine.Vector3.ctor$$Single$$Single$$Single(2, 3, 6);
21                 var w = new UnityEngine.Vector3.ctor$$Single$$Single$$Single(7, 23, 1);
22                 var n = v.get_normalized();
23                 var arr = [n.x, n.y, n.z];
24                 UnityEngine.Debug.Log$$Object(sb.AppendFormat$$String$$Object$Array("v.normalized = ({0}, {1}, {2})", arr).toString());
25                 sb.Remove(0, sb.get_Length());
26                 var cross = UnityEngine.Vector3.Cross(v, w);
27                 arr = [cross.x, cross.y, cross.z];
28                 UnityEngine.Debug.Log$$Object(sb.AppendFormat$$String$$Object$Array("Cross(v, w) = ({0}, {1}, {2})", arr).toString());
29                 UnityEngine.Debug.Log$$Object("v.magnitude = " + v.get_magnitude());
30                 UnityEngine.Debug.Log$$Object("w.magnitude = " + w.get_magnitude());
31                 UnityEngine.Debug.Log$$Object("Dot(v, w) = " + UnityEngine.Vector3.Dot(v, w));
32                 UnityEngine.Debug.Log$$Object("Angle(v, w) = " + UnityEngine.Vector3.Angle(v, w));
33                 var proj = UnityEngine.Vector3.Project(v, w);
34                 UnityEngine.Debug.Log$$Object("Project(v,w) = " + proj.toString());
35                 v.Normalize();
36                 w.Normalize();
37                 UnityEngine.Debug.Log$$Object("normalized v = " + v.toString());
38                 UnityEngine.Debug.Log$$Object("normalized w = " + w.toString());
39             }
40         }
41     }
42 };
43 JsTypes.push(V3Test);

这个文件是由 SharpKit 工程生成的,并不是手写的。

一个 JsType 用于定义一个类。里面的字段通常有:

  • fullname:表示此类的全名,也包含名字空间。V3Test 没有名字空间,所以就没有

  • baseTypeName:父类的名字。在后续的步骤中,会用于实现继承。

  • Kind:通常是 "Class",表示这是一个类。也可以是 "Struct" 或 "Enum"

  • definition:表示实例函数以及实例的 Property,以及构造函数。ctor表示构造函数。V3Test 只有 Start 和 Update 2个函数,是 MonoBehaviour 典型的2个函数。

  • staticDefinition:表示静态函数。

  • fields:实例字段。

  • staticFields:静态字段。

  • interfaceNames:接口的名字,是一个数组

可以看到,每一个类的文件,都是定义一个 JsType,文件最后把他 push 进 JsTypes 数组。

放到 JsTypes 数组干嘛呢?

includes.javascript 里有 require SharpKit/myclrhandler.javascript。可以打开这个文件看一下。这个文件里最重要的一句代码是:

1 Compile();

Compile 函数的定义是在 SharpKit/jsclr.javascript 中。有兴趣的可以看一下源代码。

Compile 主要做了2件事:

  1. 设置全局对象,使你可以访问这些类。比如说 你可以使用 UnityEngine.GameObject 来访问这个类。

  2. 处理继承关系。比如说,V3Test并没有定义 gameObject 这个属性,但是在 V3Test 中是可以 this.gameObject 访问的。

关于JS Binding跟SharpKit或JavaScript的加载流程是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI