xlua热补丁
基本热补丁
将C#函数逻辑拦截通过在lua中重写执行lua里定义的逻辑
固定流程:(每次修改C#热补丁代码都要重新执行3/4步)
- 在C#热补丁的类前面加[Hotfix]特性
- 在UnityEditor File> BuildSeting>Oher>Script Define Symbols添加
HOTFIX_ENABLE宏 - xlue>Generator code 生成代码
- xlue>hotfix inject in edior 注入热补丁
-- lua中热补丁固定写法
-- xlua.hotfix(类,"函数名",lua函数);
xlua.hotfix(CS.Main,"calAaddB",function (self,a,b) -- 成员方法第一个参数是调用对象,静态方法不用传
return a+b;
end)
多函数替换
--[[
xlua.hotfix(类,{
函数名1 = 函数1,
函数名2 = 函数2,
..
函数名n = 函数n,
-- 构造函数热补丁固定写法
[".ctor] = 函数,
-- 析构函数热补丁固定写法
Finalize = 函数
})]]
xlua.hotfix(CS.Main,{
Update = function (self)
-- print(os.time)
self:speak("123")
end,
speak = function (self,str)
print(str);
end
})
[!warning] 特殊函数热补丁
它们和其它函数不一样,==不是单纯替换==,是先调用原有逻辑再调用后添加的lua逻辑
-- 构造函数热补丁固定写法
[".ctor] = 函数,
-- 析构函数热补丁固定写法
Finalize = 函数
协程函数替换
-- 引入xlua中的util
util = require("xlua.util")
-- lua函数
fun1 = function ()
while true do
coroutine.yield(CS.UnityEngine.WaitForSeconds(1))
print("lua")
end
end
-- 用util转换成协程函数
cfun1 = util.cs_generator(fun1);
xlua.hotfix(CS.Main,{
-- 替换原有协程函数(新写一个函数函数返回值为刚刚转换后的lua函数)
fun1 = function (self)
return cfun1
end
})
属性&索引器替换
xlua.hotfix(类,{
-- 属性
set_属性名 = 函数1,(self,v)
get_属性名 = 函数2,(self)
..
-- 索引器固定写法
set_Item = 函数, 通过索引器设置 (self,index,v) --参数1调用对象,2索引,3赋的值
get_Item = 函数, 通过索引器获取(self,index)
})
改的对应下面俩东西
public int age
{
get;
set;
}
public int this[int index]
{
get
{
return index;
}
set
{
}}
事件替换
xlua.hotfix(类,{
-- 事件
add_事件名 = 函数1(self,event) 事件+操作
-- 会尝试用lua使用c#事件的方法去添加
-- 不能self:事件名("+",event)会死循环
end
remove_事件名 = 函数2(self,event) 事件-操作
..
})
泛型类替换
xlua.hotfix(泛型类(泛型类型),{
函数名1 = 函数1, -- 下面对应泛型的函数也会替换
函数名2 = 函数2,
..
})
例:
public class TClass<T>
{
public void speak<T>(T str)
{
print(str);
}
}
xlua.hotfix(CS.TClass(CS.System.Int32),{
speak = function(self,str) -- 这里的str也会转换成Int类型
print("lua" .. str)
end
})
不同类型要一个个替换(好麻烦/(ㄒoㄒ)/~~)