【Unity】热更新原理与Xlua配置
【Unity】热更新原理与 Xlua 配置
热更新
直接理解即是让代码可以像资源包一样被运行时更新。当然它其实还一个名称叫热修复,即实现不重新打包项目也能把 Bug 修好,这也正是它常用的地方。
原理
-
C# 无法直接热更新
C# 是编译型语言,需要先编译成 IL 再送到虚拟机里才可运行。部分平台不支持 C# 编译器的使用,所以没法通过直接重新编译 C# 代码来实现热更新。
-
lua 可以轻松热更新
lua 是解释性语言,不需要编译,直接在代码中传递字符串给解释器就能运行,所以可以将其作为文本资源对待,更新起来非常轻松。
-
不建议完全使用 lua 编程
解释性语言执行效率低,且 Unity 是 C# 编程环境,开发和学习的难度都会大幅提升。
-
在 C# 中混合 lua 实现热更新
例如在每个 C# 函数的开头加一句判断,如果资源文件里有该函数对应的 lua 文件,才调用 lua 代码,否则说明还不需要热更新,正常调用后续的 C# 代码就行。这样的话只有需要修 Bug 的时候才要编写 lua 代码,否则正常情况可以一直使用 C# 开发。
-
手动混合 C# 和 lua 过于麻烦
必须要求每个函数开头都要加上一段代码,想想就可怕,这工作量太大了,视觉效果也不美观。如果能实现自动把这些代码写上去且只在打包项目时才写上就好了。
-
通过 Mono.Cecil 实现 C# 库的自动修改
C# 首先会被打包成 IL 库,最后才被 IL2CPP 编译成平台代码,IL 的状态下反编译非常容易。利用 Mono.Cecil 我们可以通过程序对这些 IL 库的内容进行调整,比如实现自动修改里面每个函数的代码,从而实现上述需求。
-
使用 Xlua 实现上述需求
Xlua 已经完成了以上需求的实现,并且免费开源,我们可以直接白嫖,又有大厂加持,安全稳定,不说了开冲。
Xlua 热更新
Xlua 在官方的介绍里说是为 Unity 增加了使用 lua 脚本的能力,所以他的功能其实比较多,热更新只是其中一个。在官方文档里,热更新又叫热补丁,热补丁的文档链接如下,必看。
https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md
使用简介
- 安装方式不说了,直接去他的仓库看。 https://github.com/Tencent/xLua
- 为项目添加 HOTFIX_ENABLE 宏,从而打开热更新功能。
- 把所有你需要热更新的代码打上[Hotfix]标签,具体看文档,注意方式一高版本 Unity 用不了。
- 搞个单例类,在里面开一个 lua 虚拟机,在里面加载一个文本文件给虚拟机。
- 这个加载上来的文本文件就是写 lua 热更新代码的地方,即出了 bug 需要替换上的新代码。
- lua 热更新代码里主要是调用 xlua.hotfix 函数实现代码替换,具体看文档。
- 点击菜单项 XLua/Generate Code,然后直接打包游戏就行,Xlua 会自动按之前说过的原理修改标记好函数使其支持热更新。
注意点
-
高版本 Unity 中所有打标签方式都请使用文档中打[Hotfix]标签的方式二。
-
使用 IL2CPP 时,仅 lua 中用到的类有可能会被字节代码剥离程序删除。
IL2CPP 的过程中会自动删除没有被使用无效代码,而 lua 中调用 C#代码的方式有点类似于反射,这种间接的类型访问方式无法被 IL2CPP 程序识别,因而会导致相关代码被错误的剥离。
推荐打上[LuaCallCSharp]或[ReflectionUse]标签来解决这个问题,这样 XLua 便能自动把这些类型配置为不可被剥离。
-
GenerateCode 前建议先调用 ClearGenerateCode,这样才能保证生成的文件确实和代码中设置的一致。
其他猜想
-
为什么 C# 变 C++ 代码后,代码结构剧变,lua 也能正常调用?
C# 访问函数的方式不是直接使用地址,而是先用符号(函数名)去检索地址,然后再跳转到该地址。IL2CPP 中虽然 C# 代码被转换,但这种访问方式被保留了下来,其符号信息就存在 global-metadata.dat 文件中,所以 lua 使用 C# 中的名称也能正常访问。
总结
抛开细节不谈还是蛮简单的,不说了学 lua 去了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!