zoukankan      html  css  js  c++  java
  • JSBinding+Bridge.NET:Unity游戏热更新方案

    老版本链接如下:http://www.cnblogs.com/answerwinner/p/4469021.html

    新用户不要再使用老版本了。

     

    新版本 JSBinding 将抛弃 SharpKit 转而使用 Bridge.NET(老版本仍然维护)。

    理由是

    1. 把 C# 编译成 Js 后,Bridge 几乎100%确定转换后可运行。

        Bridge 在编译时不允许引用外部 Dll(System.dll也不行)。允许使用的 C# Api 都是 Bridge 已严格测试过的。一般来说,编译能过,就能跑。SharpKit 的 C# 源代码和 Js 源代码都比较混乱。在最初引入 SharpKit 后,群主做了大量的修补工作,仍然存在遗漏的可能。而后者不管是 C# 还是 Js,都特别严谨。

        Bridge 在 Js 端对 C# 类型系统进行了很完整的模拟。

        解决了 SharpKit 存在的许多问题。例如:块作用域闭包问题,64位整数支持。

    2. Bridge 对许多 C# 库都进行了支持。例如,你可以在 C# 中使用正则表达式,可以使用 Linq 等。

    3. Bridge 生成的代码更好看,更严谨。

    4. SharpKit 已经不维护了,Bridge.NET 仍在持续维护并有论坛可讨论问题。我问过两三个问题,都是当天回复。

     

    JSBinding+SharpKit 和 JSBining+Bridge.NET 的区别和联系 

    前者有替换 C# MonoBehaviour 为 Js MonoBehaviour 的功能。后者没有,他不允许在 gameObject 上挂逻辑代码的 MonoBehaviour,偏向于把框架代码和逻辑代码分在2个不同的工程。

     

     

    试用步骤:

    1. 先安装 VS2015(原因是 Bridge 源代码使用了 C#6.0)。可以从这里下载:https://www.visualstudio.com/zh-hans/downloads/

    2. 自己试玩一下 Bridge.NET。可以从这里下载:http://bridge.net/download/,下载第1项即可,即 Bridge.NET.15.3.0.vsix。下载完后安装。使用起来很简单的,看一下Bridge的文档:http://bridge.net/docs/

    3. 还可以下载 Bridge 源代码:https://github.com/bridgedotnet/Bridge

     

    在试玩过 Bridge 后应该对 Bridge 有一点点了解了。

     

    4. 下载 JSB + Bridge 代码(最好用 git 克隆):https://github.com/qcwgithub/qjsbunitynew_bridge

     

    目录说明

    UnityProjCs

        纯 C# 版本 Unity 工程。里面(几乎)没有 JSB 的任何东西。代码都在 AssetsScripts 下。其中,GameFramework 是框架代码,GameLogic 是逻辑代码。他们的关系是,框架代码不可以访问逻辑代码。为了方便制作 Js 版本,Assets 下最好都以文件夹组织,不要放文件,AssetsGameIcon 只是演示。

        简称Cs工程。

    UnityProjJs

        Js 版本的 Unity 工程。这个工程在初始化之前,里面就只有 JSB 相关的东西。

        简称Js工程。

    BridgeProj

        这是 Bridge 工程,用于把 C# 代码编译为 Js 代码。安装好 VS2015 和 Bridge 插件后,直接双击 BridgeProj.sln 打开即可。

        简称 Bridge工程。

     

    Cs Demo 运行步骤

    1. 用 Unity 打开 Cs工程

    2. 打开 Scenes/Demo 场景

    3. Play

     

    Js Demo 运行步骤

    1. 运行 1_link.bat

    2. 用 Unity 打开 Js工程

    3. Build Settings 切换平台至 PC

    4. 点击菜单 JSB | Gen Bindings。这一步的产出有3个:(注意点1

    • UnityProjJs/Assets/Scripts/JSBinding/G/
    • UnityProjJs/Assets/StreamingAssets/JavaScript/Gen1.javascript
    • BridgeProj/csw.cs (?)

    5. 用 VS2015 打开 BridgeProj 工程并编译。将生成 Js 代码,产出的 Js 文件在 BridgeProj/Bridge/output/下

    6. 回到 UnityProjJs,点击菜单 JSB | Update JavaScript。这一步会拷贝上一步的 Js 文件内容到 StreamingAssets/JavaScript/Gen2.javascript

    7. 拷贝 UnityProjJs/Assets/Plugins/ x86 或 x86_64 /mozjs-31.dll 至 Unity安装目录 Editor 下

    8. 打开 Scenes/Demo 场景

    9. Play

     

    这个设计是不允许 GameObject 上挂脚本的(Framework的脚本是可以的),也就是说 Prefab 和 逻辑代码不会有静态依赖关系。UnityProjJs 工程只能见到 Js 版本的逻辑代码。

     

    BridgeProj/csw.cs 是什么?

    在 Bridge 工程里是不允许引用外部 Dll 的,只能放源代码。所以就生成这么一个文件,放置框架代码的空实现文件。

     

    如何同时维护游戏的 C# 版本和 Js 版本

    运行 1_link.bat 后,会将 Cs 工程中的除逻辑代码以外的所有东西映射至 Js 工程中,逻辑代码则以 Js 文本文件的形式注入到 Js 工程中,这样就得到了 Js 版本的游戏。

    你需要自己修改 1_link.bat 来自定义要映射哪些东西。

    因为只能映射文件夹不能映射文件,所以 Cs 工程 Assets 下都要以文件夹形式组织,不要直接放文件。

    另外注意,在 BridgeProj 和 UnityProjJs 工程中都定义了 "JS" 编译符号。有一些代码只能跑在 Js ,只好加个符号来区分是哪种版本,如果不乐意可以干掉。

     

    未解决问题

    1. 目前JSComponent只能响应一部分脚本事件,例如 Awake、Start。如果需要响应其他事件,例如 OnWillRenderObject,一种方式是增加新的 JSComponentXX(继承 JSComponent),然后在 AddComponent 时,指定要用哪个。我会加入一个示例来演示怎么做。但这只是一种方式,可根据需要自定义实现。

     

     

     

    注意点1:如果你切换平台(如从 Windows 切换为 iOS),需要重新执行 JSB | Gen Bindings,并去 BridgeProj 重新编译生成 Js,然后再回 Unity 执行 JSB | Update JavaScript

     

    List.Find
    List.RemoveAll

    Dictionary<,>.Enumerator

     

    常见问题

    运行后,报错:Bridge.javascript(2640): Error: Y.inherits[0] is null!

    Bridge 有一个已知问题是 Gen2.javascript 里的类顺序不对。比如说 X 是 Y 的父类,Y.inherits[0] 就是 X。在 Gen2.javascript 里如果 Y 在 X 前面的话,就会报这个错。
    解决办法:先手动调整一下顺序,把 X  放前面。

     

    如何使用此框架

    此框架的主要思路是让 Cs和Js版本(以下简称“2种版本”)同时可维护,任何时候想跑其中一种版本都是可以的。2种版本的区别和联系:

    • Cs版本的逻辑代码是C#代码,Js版本的逻辑代码是Js代码
    • Js版本一开始是没有任何资源的,只有 JSB 本身的源代码。1_link.bat 从Cs工程映射文件夹到Js版本中,从而使Js版本“获得”了Cs版本中的所有的资源。这些映射不包括对逻辑代码的映射。逻辑代码是从Cs工程映射到BridgeProj工程中,产出Js代码,注入到Js工程中。
    • 2种版本的Prefab是一模一样的。都可以挂脚本(ScriptAgent),都可以在Inspector里给public变量赋值。ScriptAgent自动处理2种版本的差异性,用户无需关心。

    Js版本中目前脚本都是放在 StreamingAssets 下,只是为了Demo运行方便。这个目录在安卓或苹果上都是不可写的,因此不适合热更新。实现整个更新流程还需要自己打包 asset bundle 等,你需要自己决定把 Js 代码放到另一个位置。

     

    编译iOS可能遇到链接错误,尝试添加这2个库(感谢@那个少年)

    • libz.1.dylib
    • libstdc++.6.0.9.dylib

     

    更多文章:

    JSBinding+Bridge.Net:框架代码与逻辑代码的关系

    JSBinding+Bridge.NET:生成绑定(导出)

    JSBInding+Bridge.NET:把C#编译为Js

    JSBinding+Bridge.NET:Inspector拖变量支持(!)

    JSBinding+Bridge:逻辑代码中操作二进制数据

    JSBinding+Bridge.NET限制

     

    有任何问题请在群里提出,或私聊群主。

  • 相关阅读:
    windows通过Composer安装yii2
    jquery自定义函数
    js 回调
    读取.properties配置文件
    spring @ModelAttribute 注解
    excel导出
    spring定时器
    maven添加自己的jar包到本地仓库
    activeMq 消费者整合spring
    linux操作命令
  • 原文地址:https://www.cnblogs.com/answerwinner/p/6037911.html
Copyright © 2011-2022 走看看