【Unity】热更新原理与 Xlua 配置

【Unity】热更新原理与 Xlua 配置

热更新

直接理解即是让代码可以像资源包一样被运行时更新。当然它其实还一个名称叫热修复,即实现不重新打包项目也能把 Bug 修好,这也正是它常用的地方。

原理

  1. C# 无法直接热更新

    C# 是编译型语言,需要先编译成 IL 再送到虚拟机里才可运行。部分平台不支持 C# 编译器的使用,所以没法通过直接重新编译 C# 代码来实现热更新。

  2. lua 可以轻松热更新

    lua 是解释性语言,不需要编译,直接在代码中传递字符串给解释器就能运行,所以可以将其作为文本资源对待,更新起来非常轻松。

  3. 不建议完全使用 lua 编程

    解释性语言执行效率低,且 Unity 是 C# 编程环境,开发和学习的难度都会大幅提升。

  4. 在 C# 中混合 lua 实现热更新

    例如在每个 C# 函数的开头加一句判断,如果资源文件里有该函数对应的 lua 文件,才调用 lua 代码,否则说明还不需要热更新,正常调用后续的 C# 代码就行。这样的话只有需要修 Bug 的时候才要编写 lua 代码,否则正常情况可以一直使用 C# 开发。

  5. 手动混合 C# 和 lua 过于麻烦

    必须要求每个函数开头都要加上一段代码,想想就可怕,这工作量太大了,视觉效果也不美观。如果能实现自动把这些代码写上去且只在打包项目时才写上就好了。

  6. 通过 Mono.Cecil 实现 C# 库的自动修改

    C# 首先会被打包成 IL 库,最后才被 IL2CPP 编译成平台代码,IL 的状态下反编译非常容易。利用 Mono.Cecil 我们可以通过程序对这些 IL 库的内容进行调整,比如实现自动修改里面每个函数的代码,从而实现上述需求。

  7. 使用 Xlua 实现上述需求

    Xlua 已经完成了以上需求的实现,并且免费开源,我们可以直接白嫖,又有大厂加持,安全稳定,不说了开冲。

Xlua 热更新

Xlua 在官方的介绍里说是为 Unity 增加了使用 lua 脚本的能力,所以他的功能其实比较多,热更新只是其中一个。在官方文档里,热更新又叫热补丁,热补丁的文档链接如下,必看。
https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md

使用简介

  1. 安装方式不说了,直接去他的仓库看。 https://github.com/Tencent/xLua
  2. 为项目添加 HOTFIX_ENABLE 宏,从而打开热更新功能。
  3. 把所有你需要热更新的代码打上[Hotfix]标签,具体看文档,注意方式一高版本 Unity 用不了。
  4. 搞个单例类,在里面开一个 lua 虚拟机,在里面加载一个文本文件给虚拟机。
  5. 这个加载上来的文本文件就是写 lua 热更新代码的地方,即出了 bug 需要替换上的新代码。
  6. lua 热更新代码里主要是调用 xlua.hotfix 函数实现代码替换,具体看文档。
  7. 点击菜单项 XLua/Generate Code,然后直接打包游戏就行,Xlua 会自动按之前说过的原理修改标记好函数使其支持热更新。

注意点

  1. 高版本 Unity 中所有打标签方式都请使用文档中打[Hotfix]标签的方式二。

  2. 使用 IL2CPP 时,仅 lua 中用到的类有可能会被字节代码剥离程序删除。

    IL2CPP 的过程中会自动删除没有被使用无效代码,而 lua 中调用 C#代码的方式有点类似于反射,这种间接的类型访问方式无法被 IL2CPP 程序识别,因而会导致相关代码被错误的剥离。

    推荐打上[LuaCallCSharp]或[ReflectionUse]标签来解决这个问题,这样 XLua 便能自动把这些类型配置为不可被剥离。

  3. GenerateCode 前建议先调用 ClearGenerateCode,这样才能保证生成的文件确实和代码中设置的一致。

其他猜想

  1. 为什么 C# 变 C++ 代码后,代码结构剧变,lua 也能正常调用?

    C# 访问函数的方式不是直接使用地址,而是先用符号(函数名)去检索地址,然后再跳转到该地址。IL2CPP 中虽然 C# 代码被转换,但这种访问方式被保留了下来,其符号信息就存在 global-metadata.dat 文件中,所以 lua 使用 C# 中的名称也能正常访问。

总结

抛开细节不谈还是蛮简单的,不说了学 lua 去了。


【Unity】热更新原理与 Xlua 配置
https://bdffzi-blog.pages.dev/posts/4133014859.html
作者
BDFFZI
发布于
2024年2月4日
许可协议