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