InjectFix

腾讯开源的 Unity 代码逻辑热修复方案

Unity代码逻辑热修复

可用于Unity业务的bug修复,支持Unity全系列,全平台。

几个亮点

  • 直接在Unity工程上修改C#即可更新
  • 老项目无需修改原有代码即可使用
  • 每个游戏一份私有补丁格式,安全更有保障

编译安装

  • Window下打开源码包的SourceVSProjbuild_for_unity.bat,UNITY_HOME变量的值修改为指向本机unity安装目录
  • 运行build_for_unity.bat

复制

这里对应的是一个Unity工程目录

  • IFixToolKit拷贝到Unity项目的Assets同级目录
  • Assets/IFix,Assets/Plugins拷贝到Unity项目的Assets下

接入示例

判断有补丁就加载补丁

var patchPath = "./Assets/IFix/Resources/Assembly-CSharp.ill.bytes";if (File.Exists(patchPath)){ PatchManager.Load(new FileStream(patchPath, FileMode.Open));}

配置

热补丁的实现依赖于提前做些静态代码插入,所以需要配置对哪些类预处理,配置了才能被修复。一般而言,只要不是性能要求很苛刻的类都可以加入。

iFix支持动态和静态列表方式,由于类型往往比较多,动态列表会方便些。下面是一个实例,配置XLua名字空间下除匿名类之外的所有类型。

[Configure]public class InterpertConfig { [IFix] static IEnumerable ToProcess { get { return (from type in Assembly.Load("Assembly-CSharp").GetTypes() where type.Namespace == "XLua" && !type.Name.Contains("

划下重点:

配置类打上Configure标签配置的属性打上IFix标签,而且必须是 static 类型

动态配置除了不用一个个配,还可能有其它额外好处,比如上述配置,后续该名字空间下增删类,都不需要更改配置。

配置好后,打包手机版本会自动预处理,如果希望自动化打包,也可以手动调用IFix.Editor.IFixEditor.InjectAllAssemblys函数。

补丁制作

对需要打补丁的函数打上Patch标签

[Patch]public int Add(int a, int b){ return a + b;}

执行"InjectFix/Fix"菜单。

补丁制作成功后会放到工程目录下,文件名为“{Dll Name}.patch.bytes”(比如:“Assembly-CSharp.patch.bytes”),上传补丁到手机,加载就能看到效果。

注意事项:如果要Patch的函数存在条件编译宏,比如这样的代码:

[Patch]public void Job(int a){#if UNITY_EDITOR Foo();#endif#if !UNITY_EDITOR Bar();#endif}

如果还是直接在编辑器下直接生成补丁,将会比手机上运行多调用了个Foo,少调用了个Bar,这可能会导致各种问题:逻辑不对,调用了编辑器专用函数而导致找不到要调用的函数等等。

这时可以按对应平台的编译参数把Assembly-CSharp.dll编译出来,然后调用IFix.Editor.IFixEditor.GenPatch去生成补丁。

Unity编译是在工程的Temp目录新建一个文件,把命令行参数放到那个文件,然后执行类似(目录根据自己的unity安装情况而定)如下命令进行编译:

"D:Program Files甥楮祴201702EditorDataMonoBleedingEdgebinmono.exe" "D:Program Files甥楮祴201702EditorDataMonoBleedingEdgelibmono4.5mcs.exe" @Temp/UnityTempFile-55a959adddae39f4aaa18507dd165989

你可以尝试一次编辑器下的手机版本打包,然后到工程目录下的Temp目录把那个临时文件拷贝出来(编译完会自动删掉,所以要手快)。

这个文件大多数地方都不会变的,变的主要是C#文件列表,可以改为动态生成这个文件:C#文件列表根据当前项目生成,其它保持不变。然后用这个文件作为输入来编译。

github地址:

https://github.com/tencent/injectfix

更多更优质的资讯,请关注我,你的支持会鼓励我不断分享更多更好的优质文章。

bat比较有意思的代码_腾讯开源的 Unity全系列 代码逻辑热修复方案--InjectFix相关推荐

  1. android骰子游戏代码_真神器!不用手写一行代码就能做网站~

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 制作网站用什么,Dreamweaver 还是 Fireworks? 现在, ...

  2. y空间兑换代码_如何用不到 2KB 的 JavaScript 代码写一个 3D 赛车游戏?

    几个月前,JS1k游戏制作节(JS1K game jam)传出不再举办消息后,许多游戏迷开始哀嚎. Frank Force 也是其中一位,但他还有另一层身份--一位德克萨斯州奥斯汀的独立游戏设计师.F ...

  3. php 工商银行公众号支付代码_微信支付PHP SDK —— 公众号支付代码详解

    在微信支付 开发者文档页面 下载最新的 php SDK 这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请 ...

  4. 对文本根据特殊字符进行分段代码_如何优雅地配置快应用的代码片段

    本文使用 Zhihu On VSCode 创作并发布 作为一名程序员,在编码的过程中,难免会遇到要写些重复性的代码:假如每次都重新码一遍,既浪费了时间,也有伤身体.倘若可以配置一个像快捷键一样,输入简 ...

  5. 记事本贪吃蛇游戏代码_厉害了,程序员28行代码写贪吃蛇游戏,附源码!

    对于贪吃蛇游戏,大家基本上都玩过,但是作为一个程序员,大家是否想过要自己去写一个贪吃蛇,毕竟玩别人写的游戏和自己写的游戏是两种截然不同的感受,而且也可以通过制作来提升自己的技术! 其实贪吃蛇的逻辑并不 ...

  6. vscode中怎样格式化js代码_[VSCode插件推荐] Bracket Pair Colorizer: 为代码中的括号添上一抹亮色...

    在代码编写过程中,各种括号 {[()]} 必不可少.然而,随着代码量的增加,你有没有因为括号的嵌套太多,而导致代码难以阅读? 我们来看看下面的代码,在第三行代码的最后部分,连续出现了5个右括号! 这还 ...

  7. html插入flash代码_初学者必备Web开发APP,支持代码补全,一键插入代码,厉害了!...

    新手学前端神器,HTML代码补全功能太牛了! 讲过学习后端的许多优秀APP,这次来推荐一下前端用的软件. 前端,包含了HTML+CSS+JavaScript这一整套的流程,缺一不可. 其实,市面上用来 ...

  8. java事务代码_关于java中实现JDBC事务控制代码示例

    一.前言 数据库事务是执行业务的每个逻辑单元一系列操作,可由一个或多个SQL语句组成.如执行的SQL都能被正确的执行,则这批SQL提交将被生效,否则都不成功,通过这样的事务控制有效的保障了数据库数据的 ...

  9. python大作业代码_大二期末python大作业有效代码不低于5000行是什么水平?

    6月30日更新 鉴于题主说老师已经收回对行数的要求,就请大家看过则罢,不要再点赞了(还有收藏的是什么鬼?).本文说的不过是一些投机取巧的伎俩,不值取,不可取. ~~~以下是原文~~~: 一个熟练工程序 ...

最新文章

  1. shell匹配IP和shell正则匹配捕获引用
  2. C/C++: libcurl获取网页内容
  3. Windows下VTK6.0.0安装详解(CMake使用说明)
  4. CMOS图像传感器——闪烁(flicker)现象
  5. 从别的网站服务器获取数据,使用get()方法以GET方式从服务器获取数据
  6. 数据3分钟丨​PingCAP DevCon 2021回顾;openGauss社区颁发首张OGCA认证证书
  7. qtreewidgetitem 选中背景颜色_列表式报表阶梯背景色效果
  8. 【问答】开放领域问答梳理(2)
  9. 厉害了!JMeter 模拟超过 5 万的并发用户!
  10. javascript轻松解决前端数据排序(互换,置顶,上移,下移),快收藏吧
  11. supermap 点云_SuperMap三维地理设计新技术满足新需求
  12. CentOS下安装jdk11
  13. meanshift算法学习(二):opencv中的meanshift
  14. 尺缩钟慢之动钟变慢——思想实验推导狭义相对论(七)
  15. 我国跨境电子商务的发展概念以及发展概况
  16. Java笔记 - 黑马程序员_07(多线程,线程同步,线程池,网络编程入门,UDP通信原理,TCP通信原理,commons-io工具类)
  17. PHP Yar - 学习/实践
  18. 考拉海购成重构互联网版图的最大“变量”
  19. 刚刚,ChatGPT官宣数学能力再升级,网友:终于精通十以内加减法了
  20. 【转】这是一篇很完整的元器件选型指南

热门文章

  1. 【自动驾驶】19.自动驾驶各个坐标系
  2. Java集合必会14问(精选面试题整理)
  3. 关于Netty的入门使用
  4. matlab用循环批量生成多个变量,神奇的eval()函数
  5. 如何快速研究透一篇 Paper 并提出有价值的问题?
  6. 压缩感知(II) A Compressed Sense of Compressive Sensing (II)
  7. 人工智能:第六章 专家系统
  8. 数字图像处理:第二十一章 视频压缩标准
  9. springBoot ajax 报错 Circular view path [xx: would dispatch...
  10. python 35 使用 3D densecrf (DenseInferenceWrapper)