24.热补丁替换单函数

24.xLua热补丁-单函数替换


24.1 知识点

热补丁的基本概念

  • xLua热补丁是一种利用Lua脚本来修改或者替换C#代码的功能,可以实现在不修改原始C#代码的情况下,动态地改变程序的逻辑或者修复程序的错误。
  • 说人话就是用Lua代码顶替写好的C#代码。
  • xLua热补丁的基本原理是在IL层面上,将需要热补丁的C#方法的实现替换为调用Lua虚拟机的指令,从而实现将控制权转交给Lua脚本。

使用热补丁前的必要操作

在被打补丁的类前加上[Hotfix]特性

添加宏HOTFIX_ENABLE

File -> BuildSetting -> OtherSetting -> Scripting Define Symbols 添加

如果添加成功,窗口Xlua菜单栏下会多一个 hotfix inject in editor 注入热补丁的选项

xLua菜单栏点击GenerateCode生成代码

xLua菜单栏点击HotfixInjectInEditor注入热补丁


注入失败需要把xLua框架的Tools文件夹放在和Assets同级目录下


同时注意路径不要有中文
如果修改了热补丁的C#代码,一定要重新生成代码再注入热补丁

单函数替换

初始化Lua脚本

LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson24_xLua热补丁_单函数替换");

定义热补丁类

[Hotfix]
public class Lesson24_Test
{
    public int Add(int a, int b)
    {
        Debug.Log("我是C#的加法函数,只会返回666!");
        return 666;
    }

    public static void Speak(string str)
    {
        Debug.Log("我在C#说话:" + str);
    }
}

调用热补丁类的函数

Lesson24_Test test = new Lesson24_Test();
Debug.Log(test.Add(1, 1));
Lesson24_Test.Speak("我是测试类");

单函数替换

--xlua.hotfix(热补丁类, "C#函数名", lua的顶替函数)

--成员函数 顶替函数的第一个参数要传self
xlua.hotfix(CS.Lesson24_Test, "Add", function(self, a, b)
    print("我是Lua的加法函数,能正确返回加法结果")
    return a + b
end)

--静态函数 顶替函数不用传self
xlua.hotfix(CS.Lesson24_Test, "Speak", function(str)
    print("我在Lua说话:" .. str)
end)

运行结果


24.2 知识点代码

Lesson24_xLua热补丁_单函数替换.lua

print('我是Lua脚本 Lesson24_xLua热补丁_单函数替换')

print("**********知识点一 热补丁的基本概念************") 

-- xLua热补丁是一种利用Lua脚本来修改或者替换C#代码的功能
-- 可以实现在不修改原始C#代码的情况下,动态地改变程序的逻辑或者修复程序的错误。
-- 说人话就是用Lua代码顶替写好的C#代码。
-- xLua热补丁的基本原理是在IL层面上,将需要热补丁的C#方法的实现替换为调用Lua虚拟机的指令,从而实现将控制权转交给Lua脚本。


print("**********知识点二 使用热补丁前的必要操作************")
-- 在被打补丁的类前加上[Hotfix]特性

-- 添加加宏HOTFIX_ENABLE
-- 	File->BuildSetting->OtherSetting->Scripting Define Symbols添加

-- 	如果添加成功 窗口Xlua菜单栏下 会多一个hotfix inject in editor 注入热补丁的选项
-- xLua菜单栏点击GenerateCode生成代码

-- xLua菜单栏点击HotfixInjectInEditor注入热补丁

-- 	注入失败需要把xLua框架的Tools文件夹放在和Assets同级目录下


-- 	同时注意路径不要有中文
-- 	如果修改了热补丁的C#代码 ,一定要重新生成代码再注入热补丁


print("**********知识点三 单函数替换************")

--xlua.hotfix(热补丁类, "C#函数名", lua的顶替函数)

--成员函数 顶替函数的第一个参数要传self
xlua.hotfix(CS.Lesson24_Test, "Add", function(self, a, b)
    print("我是Lua的加法函数,能正确返回加法结果")
    return a + b
end)

--静态函数 顶替函数不用传self
xlua.hotfix(CS.Lesson24_Test, "Speak", function(str)
    print("我在Lua说话:" .. str)
end)

Lesson24_xLua热补丁_单函数替换

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

public class Lesson24_xLua热补丁_单函数替换 : MonoBehaviour
{
    void Start()
    {
        LuaManager.Instance.Init();
        LuaManager.Instance.DoLuaFile("Lesson24_xLua热补丁_单函数替换");

        Lesson24_Test test = new Lesson24_Test();
        Debug.Log(test.Add(1, 1));
        Lesson24_Test.Speak("我是测试类");
    }
}

[Hotfix]
public class Lesson24_Test
{
    public int Add(int a, int b)
    {
        Debug.Log("我是C#的加法函数,只会返回666!");
        return 666;
    }

    public static void Speak(string str)
    {
        Debug.Log("我在C#说话:" + str);
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏