XLua教程之热补丁技术

简介

热补丁是指在不重新安装游戏程序的前提下,使用Lua代码来快速修复线上出现bug的C#代码。

热补丁的优点与缺点

优点

1、替换整个方法体:这是最核心的功能,用 Lua 逻辑完全替换 C# 方法。

2、调用原方法:你可以在 Lua 补丁中选择是否调用原始的 C# 方法,并可以修改其参数和返回值。base 是 xLua 提供的关键字,用于调用原方法。

复制代码
xlua.hotfix(CS.SomeClass, 'SomeMethod', function(self, arg1)
    print('Before calling original method')
    -- 调用原方法,并获取返回值
    local origResult = base(self, arg1)
    print('After calling original method. Result:', origResult)
    return origResult
end)

3、修补构造函数、属性、事件、泛型方法:xLua 支持修补各种类型的成员。

缺点

1、不支持添加新成员:不能通过热补丁给一个 C# 类添加全新的方法、字段或属性。只能替换已有的成员。

2、对性能有影响 :被热补丁后的方法,其执行路径变长(需要进入Lua虚拟机),性能会比原生 C# 方法差。切忌对性能敏感的每帧执行的方法(如 Update)进行热补丁。

3、增加了包体大小:生成的热补丁支撑代码会使 IPA(iOS)或 APK(Android)的体积增大。

操作步骤

1、下载XLua文件包,准备好Xlua环境,可以参考

XLua教程之入门篇-CSDN博客

2、找到Edit=>Project Settings=>Player=>Other Settings=>Scripting Define Symbols,添加HOTFIX_ENABLE标签

3、复制xlua下载包的Tools文件夹,粘贴到工程Assets同级目录中

4、找到Assets/XLua/Src/Editor/Hofix.cs脚本

将脚本中下列代码替换成

cs 复制代码
 var inject_tool_path = Path.Combine(System.Environment.CurrentDirectory,"Tools\\XLuaHotfixInject.exe");
inject_tool_path = inject_tool_path.Replace("\\","/");

5、新建Main.lua.txt脚本、fix_bug.lua.txt脚本和XLuaManager.cs

Main.lua.txt

Lua 复制代码
local Class = CS.HotFixTest
local test = Class()
test:Say()

fix_bug.lua.txt

Lua 复制代码
xlua.hotfix(CS.HotFixTest, 'Say', function(self)
    print("被热补丁修复了")
end)

XLuaManager.cs

cs 复制代码
[Hotfix]
public class HotFixTest
{
    public void Say()
    {
        Debug.Log("Hello World!");
    }
}

public class XLuaManager : MonoBehaviour
{
    LuaEnv luaEnv = null;
    
    void Start()
    {
        luaEnv = new LuaEnv();
        luaEnv.AddLoader(CustomLoader);
        luaEnv.DoString("require 'fix_bug'"); 
        luaEnv.DoString("require ('Main')");
    }
    
    public byte[] CustomLoader(ref string filepath)  
    {
        //传入的参数是require执行的脚本文件名
        string path = Application.dataPath + "/LuaScripts/" + filepath + ".lua.txt";

        if (File.Exists(path))//判断该路径是否存在
        {
            return File.ReadAllBytes(path);
        }
        else
        {
            Debug.Log("未找到该文件!");
        }

        return null;
    }
    
    void Update()
    {
        // 每帧进行增量GC,平滑分摊GC开销
        if (luaEnv != null)
        {
            luaEnv.Tick();
        }
    }

    void OnDestroy()
    {
        //在对象被销毁时,清理Lua环境
        if (luaEnv != null)
        {
            luaEnv.Dispose();
            luaEnv = null; // 将其置为null是一个好习惯,防止后续误用
        }
    }
}

6、先清空(Clear Generated Code )再重新生成xlua插桩代码(Generate Code ),再热补丁注入(Hotfix Inject In Editor)

提示Finish的话,说明成功了

5、测试,成功使用热补丁修复!!!

注意事项

1、按需使用:不要滥用热补丁。它主要用于紧急线上C# BUG修复。常规更新应该尽量使用正常的资源热更(如替换AssetBundle)。

2、最小化补丁范围:只对需要修复的特定类和方法打 [Hotfix] 标记,以减小包体大小和生成时间。

3、清除补丁:可以使用 xlua.hotfix(CS.Class, 'Method', nil) 来清除补丁,恢复原始 C# 方法的行为。

总结

xLua 的热补丁技术是一种非常强大的"后悔药",它为 Unity C# 开发提供了宝贵的运行时修复能力。其本质是 通过预生成的适配代码在运行时将 C# 方法调用委托给 Lua 脚本执行。正确使用它可以极大地提升项目的可维护性和线上稳定性,但同时也需要开发者充分理解其原理、限制和成本,避免滥用。

相关推荐
大Mod_abfun15 小时前
Unity游戏基础-2(初识场景~项目构建)
游戏·unity·游戏引擎
secondyoung17 小时前
Markdown转换为Word:Pandoc模板使用指南
开发语言·经验分享·笔记·c#·编辑器·word·markdown
andyguo1 天前
AI模型测评平台工程化实战十二讲(第五讲:大模型测评分享功能:安全、高效的结果展示与协作)
人工智能·安全·c#
大飞pkz1 天前
【设计模式】访问者模式
开发语言·设计模式·c#·访问者模式
LateFrames1 天前
用 【C# + Winform + MediaPipe】 实现人脸468点识别
python·c#·.net·mediapipe
爱吃小胖橘2 天前
Lua语法
开发语言·unity·lua
东方芷兰2 天前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
R-G-B2 天前
【14】C#实战篇——C++动态库dll 接口函数将char* strErr字符串 传给C# ,并且在winform的MessageBox和listbox中显示。C++ string 日志传给 C#
c++·c#·strerr字符串传给c#·动态库dll传递字符串给c#·string日志传给c#·c++ string传给 c#·c++底层函数日志传给c#显示
qq_205279052 天前
unity 读取PPT显示到屏幕功能
unity·游戏引擎·powerpoint
我是唐青枫2 天前
深入掌握 FluentMigrator:C#.NET 数据库迁移框架详解
数据库·c#·.net