JSBinding + SharpKit / 编译 Cs 成 Js

时间:2022-01-02 07:29:33

轻轻一点菜单:【JSB | Compile Cs to Js】

主要产出:StreamingAssets/JavaScript/SharpkitGeneratedFiles.javascript,你的所有逻辑代码都在这里

其他产出:

Temp/AllInvocations.txt:记录所有逻辑代码对框架代码的调用 (1)

Temp/AllInvocationsWithLocation.txt:同上,但同时记录每个调用的文件名和行号 (2)

Temp/YieldReturnTypes.txt:记录逻辑代码中,所有使用 yield return 后面接的对象的类型 (3)

(1) 没啥用,就是用来看的

(2) 有用,用于后续步骤检查每个调用是否有效。这个能检查90%的情况。如果这个显示 0 errors,基本能跑。但仍然有可能运行时还会报错,毕竟 Cs 和 Js 存在着众多差异。总的来说,有了这个检查,就放心多了。

(3) 有用,跟 (2) 类似的作用。由于 MonoBehaviour 协程是在 Js 手写实现推动的 (因为转换成 Js 后, Unity不可能再推动你的协程),并不支持全部的 yield return 对象类型。目前这个文件只是用查看,暂时没有做检查。如果想深入了解要去看 StreamingAssets/JavaScript/Manual/UnityEngine_MonoBehaviour.javascript。

-------------------------------------------------------------------

传递给skc5.exe的编译符号,可以在 Compiler.cs 里找到。可以注意到,符号包含 UNITY_EDITOR,这里解释一下为什么。首先,Js里是通过给函数加后缀的方式区分重载函数的,比如说有一个类

1 class A
2 {
3 public void f(int i){}
4 public void f(string s){}
5 }

生成的Js函数名分别是

1 f$$Int32
2 f$$String

当你运行 【JSB | Generate JS and CS Bindings】时,代码是在编辑器下执行的,所以当时肯定有定义 UNITY_EDITOR。我们把A的定义改一下:

class A
{
#if UNITY_EDITOR
public void f(int i){}
#endif
public void f(string s){}
}

生成的这2个函数的名字还是

f$$Int32
f$$String

如果 Js 编译器没有定义 UNITY_EDITOR,当你调用 a.f("") 时,他生成的 Js 代码是

a.f("") // 没有后缀,调用失败!

因为他以为 f 这个函数是没有重载的,所以不会给他加后缀。结果就是调用失败!

这种情况目前不知道是否存在,反正是有一定的风险的~!

返回:Unity代码热更新方案 JSBinding + SharpKit 首页