zoukankan      html  css  js  c++  java
  • JSBinding + SharpKit / 编译 Cs 成 Js

    轻轻一点菜单:【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 首页

  • 相关阅读:
    01-NoSQL概述
    SSM快速整合
    C语言指针传参与C++引用传参,以及尾插法建立单链表使用到的引用
    IP地址相关
    二叉树的先序遍历、中序遍历、后序遍历-C语言描述
    华为5G认证练习题2
    华为5G认证练习题
    华为ICT学堂获取练习题及答案
    C++ cin对象的一些方法
    webpack学习笔记2:新建工程
  • 原文地址:https://www.cnblogs.com/answerwinner/p/5218630.html
Copyright © 2011-2022 走看看