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的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...
随机推荐
- 开始JavaScript
将脚本放在那里? 将本可以放在HTML页面上的两个位置:<head>和</head>标签之间(称为头脚本,header script),或者<body>和</ ...
- s验证数据库中字段值是否重复
daoImpl: public String isVipCode(String vipcode) { String sql = "from FfzjUserEntity where vip_ ...
- 2014年7月份第1周51Aspx源码发布详情
QF万能视频播放器源码 2014-6-30 [VS2010]本源码是一个万能视频播放器源码.可实现各种格式的影片播放功能. 1.点击[开始]按钮,弹出窗口,选择影片路径,确定后即可播放.可拖拽滚 ...
- linux内核分析——扒开系统调用的三层皮(下)
20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验 ...
- Apache Server Status主机状态查看
10月30日,国外安全研究人员发现由于对apache设置不严,导致服务器状态暴露于公网.本来apache有一个叫server-status 的功能,为方便管理员检查服务器运行状态的.它是一个HTML页 ...
- Excel常用操作
[对Excel工作表,按某一列数据进行排序] 选中这些数据,在菜单栏上点"数据 - 排序",在弹出的窗口中的主要关键字里选择这一列,按升序或降序,那么其它的数据也会跟着它一一对应变 ...
- Windows And Video Memory
MSDN Blogs > Zemblanity > Windows And Video Memory Windows And Video Memory Tom_Mulcahy 11 F ...
- MFC如何隐藏RibbonBar的QAT QuickAccessToolBar(快速访问工具栏)
在CMainFrame的中的OnCreate函数中找到 m_wndRibbonBar.LoadFromResource(IDR_RIBBON); 在这一行的下面添加 CMFCRibbonQuickAc ...
- 调用DiscuzNT webApi 注册 登录 发帖
注册.登录Discuz论坛比较简单,网上很多教程. 3.发帖出现的问题 1.iis8.0版本 asp.net 4.0 不能发帖 将discuz 的web.config文件里的 此代码 <htt ...
- MySQL分布式集群之MyCAT(转)
原文地址:http://blog.itpub.net/29510932/viewspace-1664499/ 隔了好久,才想起来更新博客,最近倒腾的数据库从Oracle换成了MySQL,研究了一段时间 ...