另类Unity热更新大法:代码注入式补丁热更新_第1页
另类Unity热更新大法:代码注入式补丁热更新_第2页
另类Unity热更新大法:代码注入式补丁热更新_第3页
另类Unity热更新大法:代码注入式补丁热更新_第4页
另类Unity热更新大法:代码注入式补丁热更新_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

另类另类 UnityUnity 热更新大法 代码注入式补热更新大法 代码注入式补 丁热更新丁热更新 眼看 Unity 引擎热火朝天 无数程序猿加入到了 Unity 开发的大本营 一些老项目 当时 ulua slua 还不如今天那样的成熟 因此他们选择了全 c 开 发 也有一些出于性能考虑 全 c 开发 也有一些没有太丰富运营经验的开发 团队 没有想太多 用全 c 爽爽地开发 用 C 开发爽爽的日子一天一天的过去了 直到突然有一天 策划老大说 我 们得做个热更新模块 突然有一天 老板说 别人游戏用 Lua 热更 新 为 什么我们不行 突然有一天 运营说 线上游戏出了个 bug 重新编译出包 审核得几天啊 嗯 这时候 受伤的总是程序猿 有没有亡羊补牢 临危受命的折衷方法 可以不用把 C 改成 Lua 可以不用区 分平台 AndroidDLL 重载 IOS 却不行 可以对任何代码做修复的方法 有的 并且用很笨的一句代码来概括 class Fucker void Fucking if PatchScript HasPatchScript Fucker Fucking do patch fuck PatchScript CallPatchScript Fucker Fucking return do origin fuck Log Info I am a original fuck 往所有的函数注入代码 当存在补丁脚本时执行补丁脚本 不存在时执行原代往所有的函数注入代码 当存在补丁脚本时执行补丁脚本 不存在时执行原代 码 码 因此 本文的热更新热更新等同于打补丁打补丁 什么是热更新 什么是热更新 吐槽一点 虽然我们这个方法确实将热更新做成模块了 但这绝对是迫不得已 的 热更新热更新绝对不是一个功能模块能实现 它是一个底层架构所决定的 要说 一个项目不好 无法实现热更新 这归根到底是架构没想好 策划没坚持 程 序没执着 运营懒得管等等各种各样复杂原因所导致的 我心目中理想热更新热更新是怎样 要热 热 对任意部位的代码进行修改 运行时 自动下载更新代码 尔后无需重启 运行时 立即重载代码 并继续运行 兼顾开发环境与生产环境的简便性 热更新在 Web 开发领域非常普遍 毕竟 HTTP 是无状态的 而游戏这种高实时 性的开发相比 要想做好热更新就确实需要架构层的更多考虑了 怎么做好热 更新 我们还是回到主题 接下来介绍方法 可以达到什么目的 对任意部位的方法体代码进行修改 运行时 立即重载代码 并继续运行 语言无关 同样的思路可以应用在 Java C Go C 等等 使用起来不太方便 亡羊补牢专用 代码注入补丁热更新大法流程代码注入补丁热更新大法流程 上面说了很多废话 接下直奔主题 要怎样做到 class Fucker void Fucking if PatchScript HasPatchScript Fucker Fucking do patch fuck PatchScript CallPatchScript Fucker Fucking return do origin fuck Log Info I am a original fuck 我们要针对 Fucker 类的 Fucking 方法进行更新 则新建 Lua 脚本 Fucker Fucking lua 文件名 Fucker Fucking lua function Func print I am a patch fuck end return Func 一个补丁脚本就此完成 当程序运行到 Fucking 函数时 实际上它执行的是 Lua 脚本 变相的实现了热更新的功能 改变代码的执行行为 STEPSTEP 1 1 执行环境 执行环境 本文针对 Unity 游戏开发 那么原语言 当然是 C 了 而打补丁的语言 当时 Lua 了 在这里我们使用 SLua 插件 它的高质量代码和强大的反射功能 非常适合代码 注入补丁热更新 class PatchScript public bool HasPatchScript string path return File Exists Script path lua public void CallScript string path string scriptCode File ReadAllString path var luaFunc this luaState doScript scriptCode as LuaFunction luaFunc call STEPSTEP 2 2 代码注入 代码注入 嗯 执行环境 非常的简单 不就是简单的 if 判断吗 估计最令人迷惑的部分 就是 如何往所有的 C 函数体前部分插入代码了 我们要做的 遍历所有的 c 文件 取得 class 类名 然后再分析函数名 定位函 数在代码中的起始位置 获取函数的参数列表 参数类型 等等 看起来很复 杂 是不是要对 c 做语法分析 词法分析了 感觉工作量很大啊 幸好 轮子已经做好了 这里要用到一个重要的库 NRefactory 包括 IDE MonoDevelop 中的语法智能提示 重构都是基于这个库进行的 有了它 语法 分析词法分析仅仅是 API 的调用而已 我们要做的 就是使用 NRefactory 找出 C 的方法体 并插入代码 using var script new DocumentScript document formattingOptions options CSharpParser parser new CSharpParser SyntaxTree syntaxTree parser Parse code srcFilePath foreach var classDec in syntaxTree Descendants OfType if classDec ClassType ClassType Class classDec ClassType ClassType Struct var className classDec Name foreach var method in classDec Children OfType var returnType method ReturnType ToString if returnType Contains IEnumerator returnType Contains IEnumerable 暂不支持 yield continue 这里找到了方法体 开始进行插入 我把使用 NRefactory 对 C 方法体注入的代码 抽象成一个单独的类 MethodInjector C 看文章底部 STEPSTEP 3 3 编写 编写 LuaLua 补丁补丁 补丁的方法 在上文 代码注入补丁热更新大法流程 中已有提及 对需要打补丁的函数 创建对需要打补丁的函数 创建 Lua 脚本脚本 如上文中要改变 Fucker Fucking 函数的执行行为 则创建 Fucker Fucking lua 脚本 文件 脚本末端

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论