Unity上面有什么好的unity 代码热更新新方案

Unity3D游戏热更新的解决方案_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:54,713贴子:
Unity3D游戏热更新的解决方案收藏
如题“Unity3D游戏热更新的解决方案”,大家都有什么好的解决方案?
乐变是卓盟科技的服务品牌,专注于为移动游戏和App提供升级,分包和加固的技术服务.乐变热更新可实现用户无感知的自动差分更新,已服务业内数千款产品,有效提升运营效率
版本包asset不可缓存,那么比对版本号,然后确定是否更新。服务器上用新的包替换原本的assetbunde,名称一样,但是新的bundle中含新的脚本逻辑
回复 adamsw01 刚接触ios,对此问题只能抱歉。我会留意。论坛里说只能用于windows。所以这个人用python或者js[$1]Have you looked at the asset store? I think one guy implemented something like this, but it only works on Windows. It would be awesome if you could make it works on both Windos and Mac![As for usecases, I think using Lua will really help with a lot of things. Level creation is one thing for sure. Using lua files to create levels would be much easier to fix and patch the game. Instead of having to upload the whole big executable file, we can upload the fixed lua files.I need a solution that works on both Mac and PC, so I'm currently using the python one on asset store, and the javascript with Jurassic Engine.
预物体上的脚本、用代码加上去、不过要是有public 的属性就有点繁琐了
如果pc客户端的话是有解决办法的1、代码全部写成dll2、更新dll文件就可以达到热更新代码3、更新其他资源包
最好的Unity3D热更新脚本,没有之一C#Lite
unity3d,「京东」全民图书盛宴,30万图书满200-80!JD图书阅不止 乐不停,阅读风向标,悦享好书!
推荐去看看李总的C#LITE, 非常强大
ulua或者c#light,都支持热更新
JS热更新方案支持:1) 开发时用C#,发布时一键转换成JS,也可以直接写JS2) 更新时仍然支持拖拽public变量,结构体,数组3) 与强大的 SharpKit.net 配合,无缝转换C#4) 支持泛型5) 支持继承关系6) 支持任意 delegate7) 支持几乎所有的 C# 语法
还是基于lua 的热更新方案靠谱。下面是一个全新框架
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或uLua、C#Light、Dll
目前正好在做这方面的调研,简单说一下目前掌握的情况,抛砖引玉&br&&br&- uLua 跟另外两个方案比运行效率没有优势&br&- C#Light 不支持泛型,委托事件需要用特殊的方式封装,详见 &a href=&///?target=http%3A///archives/3116& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSLight研究院之学习笔记脚本NGUI里的回调方法(二)&i class=&icon-external&&&/i&&/a&&br&- Dll iOS上貌似没办法动态载入,有了解的请指教&br&&br&之后实际项目有积累以后再回来更新
目前正好在做这方面的调研,简单说一下目前掌握的情况,抛砖引玉 - uLua 跟另外两个方案比运行效率没有优势 - C#Light 不支持泛型,委托事件需要用特殊的方式封装,详见
- Dll iOS上貌似没办法动态载入…
已有帐号?
无法登录?
社交帐号登录为什么Unity没有实现iOS平台代码热更新?
可能问题不太准确,我不是说无法通过Lua或者其他的脚本语言通过内嵌虚拟机实现。
以下是我个人的猜测:Mono无法在非AOT模式下关闭JIT模式下运行吗?如果可以我觉得完全有可能在Mono层去掉AOT编译,关闭JIT就可以实现。还是说已经实现了,只是因为其他的原因没有人用?
或者可能是Unity在iOS平台如果不进行AOT编译就会导致整体的性能下降,那是否可以实现客户层指定的部分程序集使用非AOT编译?==============以下作为目标使用场景的补充=====================
所谓热更新就是指代码可以不通过重新打包提交App Store的方式来更新客户端的执行代码。由于以下几个原因客户端更新希望更加轻量和快速
1、App Store的审核周期比较难控制。
2、手机网络游戏更新频繁。
3、对于大型游戏,玩家更新成本太大。所以需要新的代码可以在简单的发布之后可以直接被客户端动态加载执行,而不需要重新提交App Store,玩家也不需要重新下载安装整个程序。
现有的方案是在Unity环境里内嵌一个Lua虚拟机,经常变动的和对执行效率没要求的逻辑用Lua实现,游戏启动时加载服务器上最新的Lua字节码来执行游戏。
如果C#的程序集可以动态加载,就无需嵌入其他的虚拟机来实现动态逻辑。
题主的问题:Mono无法在非AOT模式下关闭JIT模式下运行吗?如果可以我觉得完全有可能在Mono层去掉AOT编译,关闭JIT就可以实现。还是说已经实现了,只是因为其他的原因没有人用?Mono的执行引擎有两种实现思路:编译:把MSIL编译为机器码。编译的时机可以在运行时(JIT编译),也可以在运行前(AOT编译)。解释:Mono有解释器实现,不过它只用于在移植到新平台时方便运行时和JIT编译器可以并行开发,JIT编译器开发好之后解释器就“退休”了。所以在发布出来的Mono build里都没解释器…(微软自家的CLR也是这个情况)。另外在最新的Mono里解释器已经被彻底去掉了:于是对用户来说,Unity带的Mono就是不能配置成解释模式,而必须用编译模式的…话说题主能补充一下目标使用场景不?所谓“热更新”代码是类似不通过AppStore下载更新,而直接下载更新代码并反映在应用里么?也就是说是一种部署场景的需求而不是调试场景的需求?
(有11张图,手机党酌情打开)刚好上周CJ上Unity展台开展的技术讲座中有一节就是讲Unity iOS热更新的,照了照片,简单跟大家分享一下,可能稍微有点不对题,大家捡有用的看。首先,正如大家说的,Apple是不允许代码热更新的,Unity也只是给有热更新需求的提供一些建议,不会在官方层面提供解决方案,除非Apple放开。然后讲了Unity热更新的注意点和Unity的几个重要路径然后是使用Lua进行iOS热更新的总体流程最后对支持Unity iOS热更新的各种插件进行了对比后面还有自己写的案例做的性能分析,拿uLua(Asset Store官方商店上的)、uLua&cstoLua(这两个最终肯定会统一)、sLua做对比,照片没拍,总共有六七种情况的对比,总结下来就是uLua(Asset Store)的性能消耗要比uLua&cstoLua和sLua大的多。因为答主本身没有亲自做过iOS热更新,有不对的地方希望大家提出来共同讨论
iOS本身不允许动态生成代码,所以没法JIT吧?No Dynamic Code GenerationSince the iPhone's kernel prevents an application from generating code dynamically Mono on the iPhone does not support any form of dynamic code generation.
楼上已经把原因说的很明白了。iOS是不允许不通过AppStore更新代码的。Mono和Unity当然不会跟规定对着干。作为开发商你想绕过这些自己做热更新也不是没有办法。一个极端的例子就是WebView,js代码随便你怎么改不会有人管你的。又或者UniLua之类的解决方案。但是注意,这些玩法其实都是不符合规定的。所以如果万一搞大了苹果想要搞你就是分分钟的事。其实我一直觉得现在手游对于热更新的需求没有想象中的那么大。设计阶段做扎实一点,用数据驱动更新可以满足99%的case。
首先,从技术层面上可以实现。题主也知道。其次,苹果明文规定不让应用下载code,但是大陆游戏还是在明目张胆地下载lua字节码,这是苹果睁一只眼闭一只眼吧。最后,最重要的原因,使用Unity的人对于热更新需求没有那么大。在大陆,热更新才是必备的硬性要求。所以土生土长的Cocos2D所有版本都具备热更新功能。而看Unity使用者的比例来看,使用Unity的人并不会把热更新作为一个硬性要求,看一下uniLua sLua之类的项目,也都是国人在作为主要吧。归根到底,还是需求决定。
最近刚好在在研究Mono就来回答下这个问题。我们知道C#脚本首先会被编译成IL代码,然后再由CLR从内存中读取这些IL代码并将其转化为原生代码,这是.NET程序的运行机制,而Mono是.NET在开源社区中的一种实现,Mono对C#代码的编译分为两种,即即时编译JIT(动态)和提前编译AOT(静态),这是Mono能为我们提供的两种编译方式。而从客观上来讲,iOS禁止通过JIT这种方式来编译,所以你无法绕过AppStore直接对程序进行更新,因为即使你更新了C#脚本,由于这些脚本是没有经过编译的,它是无法直接运用到实际环境里的,而使用Lua进行热更新,实际上改变的是应用层的逻辑,核心逻辑依然是在游戏发布时就和应用程序一起打包了,因为Lua无需编译,所以它可以像普通文本资源一样更新,和C#一样Lua无法在运行时期间产生新的代码,它永远都是调用已存在的代码。所以综上所述,Unity引擎在iOS上无法热更新的关键是在iOS系统禁止了即时编译JIT这种权限,这个锅Unity和Mono都不背,谢谢!
给的ppt已经给出思路。我再补充两点。1. lua本身热更新有解决方案。搭建起来并不困难。消耗时间的是Lua本身的开发和调试。2. 其实资源热更新才是大坑。
iOS的12306可以热更新,目测是远程下载js和html。
请参考广电通知。。热更的同学一路走好~
已有帐号?
无法登录?
社交帐号登录Gad-腾讯游戏开发者平台
Unity热更新方案探索与讨论
版权所有,禁止匿名转载;禁止商业使用;禁止个人使用。
热更新必要性· App Store审核周期长· 应用更新频繁· 更新版本对留存数据有很大影响Lua相关· Lua:脚本,解释性语言· LuaJit:扩展高效版本,支持编译成二进制代码。· Tolua++:C/C++函数对象转化为lua能调用形式。· Cstolua:C#函数对象转化为lua能调用形式。   ulua、slua、unilua以及鹅厂johnche大神的xlua,ulua、slua是比较成型的解决方案,xlua现在起步不久,功能性以及周边不足够完善成熟,但tdr支持很好。性能方面ulua和slua各种较劲,unity官方给了个测试,可参考http://ulua.org/上有ulua与其它lua方案的性能比较。系统架构  我选取一种外面很多游戏已经采用的解决方案ulua,并参考了ulua简单框架,针对一般游戏的更新需求,做出UI模块的热更新设计。对于游戏主逻辑,变化很少,主要针对UI系统的热更新。与UI模块相关的有网络、UI资源以及各UI系统逻辑。如图:红色模块使用Lua文件编码,其它使用C#编码。资源:UIPrefab打包成Assetbundle,Lua文件也可以打包成Assetbundle资源更新:可用IIPS组件。Lua组件:C#与Lua的交互支持系统,详见后面。网络:数据进入Model,对于协议的解析在Lua文件中完成,使得可以支持网络协议数据变更。UI管理器没有使用Lua,因为它同其他框架性的系统一样,负责管理UI资源的加载、释放、界面层级等,逻辑比较固定。 热更新流程  资源更新可使用iips。下面是目前demo的实现。资源准备  UI Prefab资源的各平台打包Lua文件更新流程ULUA技术实现  将luajit生成各平台的库文件,放到Plugins目录,在Unity启动时加载库使用。下面是C#和Lua的交互过程。CSToLua  Ulua新的名字叫tolua,核心思想是利用C#的反射,将C#类代码进行包装,并注册到Lua里。C#和Lua的函数调用是标准C调用(stdcall),使用Lua API把参数压栈,并调用函数。这样Lua代码里能方便的访问C#代码。如C#类PanelManagerPanelManager类的包装,将成员变量和函数注册到Lua。但并不包括基类的,所以基类需要另外的Wrap。Lua中使用PanelManager = LuaHelper.GetPanelManager();C#访问Lua  框架图中Model是Lua代码编写,在C#中经常会访问Model中的数据。C#访问lua文件的全局变量比较容易,对类对象的访问需要注意。这是因为Lua在面向对象编程方面,比较难以理解,它是通过Lua元表(MetaTable)实现。示例:LuaFunction createObj = luaState.GetFunction("createObj");if (createObj != null){object[] obj = createObj.Call("Account");LuaTable table = obj[0] as LuaT取lua中创建的对象double balance = (double)table["balance"];访问成员变量Debug.Log("another " + balance);LuaFunction func = (LuaFunction)table["testtable"];if (func != null){调用对象成员函数,注意第一个参数是对象引用,类似于thisobject[] retVals = func.Call(table,"aaaaa");}{Debug.LogError("func is null");}}UI模块设计代码框架设计与部分类图:1、ModelManager、UIManager、LuaBehaviour、ControllerBase加入到Wrap中,使得C#和Lua可以交互调用。2、ModelMediater作为ModelManager与GameModel的中间层,在Lua代码中注册所需要Model、维护生命周期、网络数据传输、消息事件机制等。隔离了Model的Lua代码与C#代码,以支持GameModel的动态修改。3、UIMananger负责UI的生命周期、显示层级、UI消息分发等。调用LoadUI,加载Prefab资源,然后在gameObject上添加ControllerBase组件。4、ControllerBase在Awake时加载对应的Lua文件,初始化与Mono对应的Lua函数,使得Lua代码与Mono的 Awake、Start、Update等统一。把ControllerBase设计成固定的框架文件,隔离了UI系统与C#代码,以支持动态修改。5、Controller可以包含多个UIView,在Start时调用UIView的OnInit初始化界面。还可以设计Controller和UIView的消息机制(待定)。  在ModelMediater和ControllerBase隔离后,UI模块的MVC独立于C#代码,可以实现任意修改。UIPrefab打包成AssetBundle实现更新,如此即可完成UI系统的热更新。Demo实现(ULua+NGUI)  Demo还没有完全按设计完成,主要是Model没有实现。1、Assetbundle打包文件以及Lua文件放在StreamingAssets,在Unity导出时包含到应用程序中一起发布。2、将AppConst的DebugMode设置为false。程序启动时检查C:?simpleframework的资源,模拟从网络下载;若没有,则从本地的StreamingAssets解压;若有,则检查更新,更新完成后初始化Lua。  NGUI消息机制:由于可以将C#代码Wrap并注册到Lua,所以Lua代码可以方便的访问NGUI的消息接口。运行结果:  Call CSharp按钮点击后,再调用C#代码,验证Lua与C#的相互调用。点击Open按钮,调用UIManager打开新的UI对话框MessageBoxPanel。运行结果:修改MessageBoxPanel.lua,拷贝到C:?simpleframework?lua?View目录下,模拟更新过程。客户端启动后比较MD5码更新。运行结果:Lua调试工具1、ZeroBrane Studio 参见http://doc.ulua.org/article/ulua/uluayuzerobranestudiolianhetiaoshi.html2、Lua Studio 参见/article/f71dab641d1d1.html 3、BabeLua-vs2012-and-vs2013插件设置参考/bbs/read.php?tid=205043使用技巧http://blog.csdn.net/babestudio这个是集成到visualstudio中的,应该更为方便,但我还没成功试用。。。,请知道的大神不吝赐教。  Unity的Lua热更新方案很早就有人做了,成熟起来还是自去年开始,现在也越来越多游戏采用了lua。说几点Lua缺点来讨论:1、团队能力要求对lua有比较深的理解,避免采坑,需要编码规范文档以及注意事项等,对于没有积累的团队,这些知识建档需要从零开始。2、编码效率不高,智能提示不完善。如LuaStudio,对于c#运行时注册到lua的类对象以及函数是没有智能提示的,但如果在代码文件中写过了这个接口,LuaStudio是可以扫描到的。3、调试堆栈ok的,但这种机制决定了Unity的Profile不能到内部。参考资源Lua官网http://www.lua.org/Luajit http://luajit.org/luajit.htmlsLua /pangweiwei/sluauLua参见http://ulua.org/xLuahttp://pub./project/home?projectName=XLua&comeFrom=push_32254Lua程序设计http://lua.hust.cc/Lua面向对象设计/articles/QVBBRvqLua性能技巧/a/2649?utm_source=tuicool&utm_medium=referral
下载次数:37
分类:(原创)Unity3D圈
登录后参与讨论。点击
请勿发表无意义的内容请勿发表重复内容请勿发表交易类内容禁止发表广告宣传贴请使用文明用语其它
淫秽色情政治倾向人身攻击抄袭剽窃广告刷屏恶意挖坟冒充他人其它

我要回帖

更多关于 unity3d 热更新方案 的文章

 

随机推荐