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 的任何东西。代码都在 Assets\Scripts\ 下。其中,GameFramework 是框架代码,GameLogic 是逻辑代码。他们的关系是,框架代码不可以访问逻辑代码。为了方便制作 Js 版本,Assets\ 下最好都以文件夹组织,不要放文件,Assets\GameIcon 只是演示。
简称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 ,只好加个符号来区分是哪种版本,如果不乐意可以干掉。
未解决问题
- 目前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种版本的入口点不同。在Demo中,一开始要显示登录界面,逻辑由Login.cs控制。为了保持2种版本的一致性,Login.prefab上面是不可以直接把Login.cs挂上去的(Login.prefab会映射到Js工程中,而Js工程中根本没有Login.cs)。那么如何让Login.cs工作起来呢。看CodeEntry.cs文件,他对2种版本区别对待。如果是Cs版本,则非常简单,挂上去Login.cs即可;如果是Js版本,则需要挂 JSComponent并指定Js脚本为Login。之后的事情就交给Login脚本去做了,CodeEntry没有用了,CodeEntry就只是让逻辑跑起来而已。
Js版本中目前脚本都是放在 StreamingAssets 下,只是为了Demo运行方便。这个目录在安卓或苹果上都是不可写的,因此不适合热更新。实现整个更新流程还需要自己打包 asset bundle 等,你需要自己决定把 Js 代码放到另一个位置。
更多文章:
JSBinding+Bridge.Net:框架代码与逻辑代码的关系
有任何问题请在群里提出,或私聊群主。
JSBinding+Bridge.NET:Unity游戏热更新方案的更多相关文章
- Unity代码热更新方案 JSBinding + SharpKit 首页
目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到 JavaScript (引擎是 Mo ...
- unity游戏热更新
链接:https://pan.baidu.com/s/1ggWP0OF 第 1 章 : 热更新技术学习介绍 课时1:101-热更新技术学习介绍 11:55 什么是热更新? 举例来说 游戏上线后,玩家下 ...
- unity游戏热更新总结
1.利用反射来做Dll更新 这种方式只支持windows以及安卓这种支持JIT的平台,对于IOS就不适用了,IOS这种Full-AOT的平台不支持生成新的代码,因此这种热更方式很少用到. 2.利用 ...
- Unity3D 热更新方案总结
如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...
- Unity实现c#热更新方案探究(三)
转载请标明出处:http://www.cnblogs.com/zblade/ 前面两篇文章从头到尾讲解了C#热更新的一些方案,从程序域来加载和卸载DLL,到使用ILRuntime来实现安卓和IOS平台 ...
- Unity官方发布热更新方案性能对照
孙广东 2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对 ...
- unity热更新方案对比
Unity应用的iOS热更新 • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对Unity 应用进行热更新 • 支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...
- 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...
- Unity3D 热更新方案(集合各位专家的汇总)
http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...
随机推荐
- 一个非常有意思的css3属性filter
filter这属性貌似可以是img图片在黑白与彩色间转换 filter:grayscale(1)为黑白色,filter:grayscale(0)位彩色,可以用于hover效果 img:hover{fi ...
- windows10(x64)+Qt+opencv配置及测试
本电脑系统:Windows10 64位 要下载的文件: 1.Qt 5.6.0 for Windows 32-bit,下载地址:(可以复制链接地址,用迅雷下载,速度快) http://download. ...
- Spark MLlib 之 Basic Statistics
Spark MLlib提供了一些基本的统计学的算法,下面主要说明一下: 1.Summary statistics 对于RDD[Vector]类型,Spark MLlib提供了colStats的统计方法 ...
- knockout.js 简介
Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化. Knockout有如下4大重要概念: 声明式绑定 (Declarative Bindings):使用 ...
- 直接请求json文件爬取天眼查企业信息(未解决验证码问题)——python3实现
几个月前...省略一堆剧情...直接请求json文件爬取企业信息未成功,在知乎提问后,得到解决,有大佬说带上全部headers和cookie是可以的,我就又去试了下,果然可以(之前自己试的时候不行,没 ...
- [转]IoC模式
IoC模式 1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它 ...
- python-selenium之firefox、Chrome、Ie运行
测试脚本是否支持在不同浏览器运行firefox浏览器运行脚本 from selenium import webdriver driver=webdriver.Firefox() driver.get( ...
- MAC下如何显示隐藏文件
1.在终端上输入以下命令 defaults write com.apple.finder AppleShowAllFiles -bool true 2.重新启动Finder Command + Opt ...
- (转)C#实现MD5加密
首先,先简单介绍一下MD5 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和r ...
- Python 程序员经常犯的 10 个错误
关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对 ...