千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,JS Binding跟SharpKit或JavaScript的加载流程是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先,现
千家信息网最后更新 2026年11月03日JS Binding跟SharpKit或JavaScript的加载流程是怎样的

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

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

先看下 StreamingAssets/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 上的配置:

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 library26 //--------------------------------------------------27 CS.require("SharpKit/jsclr");28 CS.require("SharpKit/clrlibrary");29 30 // 1) Files generated by JSBinding31 // may overwrite some classes in step 0)32 //--------------------------------------------------33 CS.require("GeneratedFiles");34 35 36 // 2) Manually written js37 // 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 SharpKit49 //--------------------------------------------------50 CS.require("SharpKitGeneratedFiles");51 52 53 // 4) JavaScript implemented54 // 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 handler69 //--------------------------------------------------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的加载流程是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

文件 代码 函数 只有 名字 字段 实例 对象 数组 比如说 问题 流程 入口 内容 工程 是在 是由 更多 空间 静态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技怎么样 互联网最新的科技 科技与互联网 互联网科技有限公司图片 科技创新互联网企业 米客互联网科技 济南和联互联网科技有限公司 小米互联网科技园设置 和信科技工业互联网 互联网媒体平台算高科技产业 广州市恰铎互联网科技有限公司 米聚互联网科技南京有限公司排面 银川新华互联网科技学校联系电话 每天都有哪些好的互联网科技 互联网科技快讯热点 北京互联网科技类企业分布 好易买互联网科技 杭州科技互联网公司有哪些 重庆科技产业互联网有哪些 山东亿川互联网科技有限责任公司 广州为想互联网科技有限公司 互联网科技垄断 互联网高科技企业 互联网科技大会 互联网科技博客 滨湖区互联网智能科技产品供应 科技大学互联网专业好不好 福建科技产业互联网发展 上海京穆互联网科技有限公司 广东工业互联网大赛深圳学泰科技
0