xLuaUnity热更新学习(3) - xLua热补丁

xlua热补丁 基本热补丁 将C#函数逻辑拦截通过在lua中重写执行lua里定义的逻辑 固定流程:(每次修改C#热补丁代码都要重新执行3/4步) 在C#热补丁的类前面加[Hotfix]特性 在UnityEditor File> BuildSeting>Oher>Script Define Symbo

xlua热补丁

基本热补丁

将C#函数逻辑拦截通过在lua中重写执行lua里定义的逻辑
固定流程:(每次修改C#热补丁代码都要重新执行3/4步)

  1. 在C#热补丁的类前面加[Hotfix]特性
  2. 在UnityEditor File> BuildSeting>Oher>Script Define Symbols添加HOTFIX_ENABLE
  3. xlue>Generator code 生成代码
  4. 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ㄒ)/~~

LICENSED UNDER CC BY-NC-SA 4.0
评论