poney 发表于 2021-1-8 17:51

Unity上面有什么好的热更新方案?

rt,最好是已经有线上产品在应用的。

楚一帆 发表于 2021-1-8 17:57

unilua。
或者改mono源码,加进去热更新功能。

天一教育培训寐 发表于 2021-1-8 18:07

参考xlua原理加ILRuntime制作的XIL
大家可以关注下,github地址:https://github.com/wuxiongbin/XIL

风来时狂放 发表于 2021-1-8 18:13

关于热更新,官方也无法给出一个比较确定的方案,当然可以使用assetbundle进行资源更新,使用反射将代码打包编译成dll进行热更新,只是在移动平台上就有些问题了,特别是ios平台,反射操作无法使用。目前用的比较多的第三方更新方案是使用lua,这个由曾经魔兽世界采用作为界面脚本,从而红遍整个游戏行业,十年经久不衰的脚本。unity有很多三方lua的绑定库:slua,ulua,C#Light/Evil等等,其中个人觉得国内使用相对较广且性能还不错的应该是ulua(可以自行搜索一些公司的招聘需求,已经有公司直接将会ulua这条列入岗位要求了)。这个是ulua的官方网站:ulua - unity效率最高、最完善的热更新方案!!,网站上除了有ulua的框架源码,还有官方的视频教程和交流群可以更方便的上手,可以自行下载学习。

音乐之家1 发表于 2021-1-8 18:18

noodle1983/UnityAndroidIl2cppPatchDemo原项目简化重写了一遍
可以热更代码、序列化配置和资源,底层是c,不会有效率问题
不需要反射,也不需要lua,Unity里面怎么写都行,没有什么限制
noodle1983/UnityAndroidIl2cppPatchDemo我是作者,顺便卖自己,详见里面说明

hecgdge4 发表于 2021-1-8 18:22

如果题主问的是,有没有好的资源热更新方案?答案是,AssetBundle。
如果题注问的是,有没有好的代码热更新方案?就要多说几句了。。

Unity的代码热更新有两种方式:
1 assetbundle代码热更新
Unity的代码热更新机制可以简单概括为以下几步:
项目开发中,可以将部分逻辑提取至一个单独的代码库工程中,打包为DLL。将DLL打包为AssetBundleUnity程序动态加载assetBundle中的DLL文件,使用Reflection机制来调用代码。

程序运行时的状况如下:


这个方案是真正的c#级别的代码热更新,但它有很多限制:
1 iOS平台不支持
2 这些DLL中的脚本不能在编辑器中使用
3 如果脚本在动态Dll里,调用AddComponent()挂此脚本在Prefab上时不能使用AddComponent("SomeScript"),要用AddComponent(Type.GetType("SomeScript"));
4 动态DLL里使用无效

2 lua热更新
lua是iOS平台下,热更新方案的唯一解。目前最成熟的lua插件是uLua&cstoLua,有成功的商业产品案例(啪啪三国、绝地战警)等。
即便有成功案例,但也绝不可能大范围使用lua,效率是个大问题。
但值得注意的是,即使是使用lua,仍然是不符合appstore的政策,依然存在被下架的风险。

综上所述:
对于Unity的代码热更新,并没有好的方案。只有差的方案(AssetBundle)和更差的方案(Lua)。
Android:优先用AssetBundle。
iOS:对性能不敏感的逻辑,例如界面逻辑,小范围使用Lua。

我放心你带套猛 发表于 2021-1-8 18:24

我目前的项目,开始就定下了热更的设计目标,综合大家的接受度,脚本选了Lua
解释器用的uniLua,配套的开发模块有下:
1.手动接口封装,弃用了FFI是因为性能考虑
2.Lua文件合并加载,解释器加载接口稍作改动,为了提高加载速度
3.资源管理热更新实现
至于担心的性能问题,总结一句话就是不存在,性能问题在于设计,要具体问题具体分析

Jacqueline季 发表于 2021-1-8 18:34

没有用js的吗?有很多开源的c#转js工具,再配合iOS的JavascriptCore应该很方便啊!

jimmy肖明 发表于 2021-1-8 18:37

资源assetbundle,代码我倾向于不更新。逻辑代码组件化,然后拼出逻辑。比如playmaker的方式。

唰唰冷呵映 发表于 2021-1-8 18:39

yukuyoulei/ILRuntime_HotGames基于ILRuntime的热更新能力实现的可以直接使用的框架。
AHotGames是C#热更项目。 UHotGames是Unity项目。


真正的C#代码热更方案,只有很少量的限制(目前碰到的只有可空类型修饰符(?),还有ILRuntime群里一哥们儿提到的Task)。


ILRuntime的项目地址:
Ourpalm/ILRuntime
页: [1] 2
查看完整版本: Unity上面有什么好的热更新方案?