25.热补丁替换多函数

25.xLua热补丁-多函数替换


25.1 知识点

准备工作

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

多函数替换

创建一个测试类,包含一些函数

[Hotfix]
public class Lesson25_TestMonoBehaviour : MonoBehaviour
{
    void Update()
    {
        Debug.Log("C#的Update!");
    }

    public int Add(int a, int b)
    {
        Debug.Log("我是MonoBehaviour的测试类的加法函数,只会返回666!");
        return 666;
    }

    public static void Speak(string str)
    {
        Debug.Log("MonoBehaviour的测试类说话:" + str);
    }
}

调用测试类的方法

Lesson25_TestMonoBehaviour testMonoBehaviour = this.gameObject.AddComponent<Lesson25_TestMonoBehaviour>();
testMonoBehaviour.Add(1, 1);
Lesson25_TestMonoBehaviour.Speak("哈哈哈哈");

批量替换测试类方法

--回顾热补丁但函数替换语法
--xlua.hotfix(热补丁类, "C#函数名", lua的顶替函数)

--xlua.hotfix(热补丁类, {C#函数名1 =  lua的顶替函数1,#函数名2 =  lua的顶替函数2....})
xlua.hotfix(CS.Lesson25_TestMonoBehaviour, {
 
    Update = function(self)
        print("Lua的Update" + os.time())
    end,
 
    Add = function(self, a, b)
        print("我是Lua的加法函数,能正确返回加法结果")
        return a + b
    end,
 
    Speak = function(str)
        print("我在Lua说话:" .. str)
        print(str)
    end
})

特殊函数替换

创建有构造函数,普通函数,析构函数的测试类

[Hotfix]
public class Lesson25_Test
{
    public Lesson25_Test()
    {
        Debug.Log("Lesson25_Test测试类的 构造函数");
    }

    public void Speak(string str)
    {
        Debug.Log("测试类说话:" + str);
    }

    ~Lesson25_Test()
    {

    }
}

调用测试类的构造函数和普通函数

Lesson25_Test test = new Lesson25_Test();
test.Speak("嘻嘻嘻嘻");

批量替换测试类的函数,注意构造函数和析构函数

xlua.hotfix(CS.Lesson25_Test, {
 
    --替换 构造函数 传入的C#函数名是 [".ctor"]
    --Lua构造函数不会直接替换掉C#构造函数 而是先调用C#构造函数逻辑 再调用lua替换的构造函数逻辑
    [".ctor"] = function()
        print("Lua热补丁 的 构造函数")
    end,
 
    Speak = function(self, str)
        print("我在Lua说话:" .. str)
    end,
 
    --替换 析构函数 传入的C#函数名是 Finalize
    --和构造函数一样 先调用C#构造函数逻辑 再调用lua替换的构造函数逻辑
    --而且要保证替换的热补丁类存在析构函数 否则报错
    Finalize = function()
    end
})

25.2 知识点代码

Lesson25_xLua热补丁_多函数替换.lua

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

print("*********知识点一 多函数替换***********")

--回顾热补丁但函数替换语法
--xlua.hotfix(热补丁类, "C#函数名", lua的顶替函数)

--xlua.hotfix(热补丁类, {C#函数名1 =  lua的顶替函数1,#函数名2 =  lua的顶替函数2....})
xlua.hotfix(CS.Lesson25_TestMonoBehaviour, {

    Update = function(self)
        print("Lua的Update" .. os.time())
    end,

    Add = function(self, a, b)
        print("我是Lua的加法函数,能正确返回加法结果")
        return a + b
    end,

    Speak = function(str)
        print("我在Lua说话:" .. str)
        print(str)
    end
})


print("*********知识点二 特殊函数替换***********")

xlua.hotfix(CS.Lesson25_Test, {

    --替换 构造函数 传入的C#函数名是 [".ctor"]
    --Lua构造函数不会直接替换掉C#构造函数 而是先调用C#构造函数逻辑 再调用lua替换的构造函数逻辑
    [".ctor"] = function()
        print("Lua热补丁 的 构造函数")
    end,

    Speak = function(self, str)
        print("我在Lua说话:" .. str)
    end,

    --替换 析构函数 传入的C#函数名是 Finalize
    --和构造函数一样 先调用C#构造函数逻辑 再调用lua替换的构造函数逻辑
    --而且要保证替换的热补丁类存在析构函数 否则报错
    Finalize = function()
    end
})

Lesson25_xLua热补丁_多函数替换

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

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

        Lesson25_TestMonoBehaviour testMonoBehaviour = this.gameObject.AddComponent<Lesson25_TestMonoBehaviour>();
        testMonoBehaviour.Add(1, 1);
        Lesson25_TestMonoBehaviour.Speak("哈哈哈哈");

        Lesson25_Test test = new Lesson25_Test();
        test.Speak("嘻嘻嘻嘻");

    }
}

[Hotfix]
public class Lesson25_TestMonoBehaviour : MonoBehaviour
{
    void Update()
    {
        Debug.Log("C#的Update!");
    }

    public int Add(int a, int b)
    {
        Debug.Log("我是MonoBehaviour的测试类的加法函数,只会返回666!");
        return 666;
    }

    public static void Speak(string str)
    {
        Debug.Log("MonoBehaviour的测试类说话:" + str);
    }
}

[Hotfix]
public class Lesson25_Test
{
    public Lesson25_Test()
    {
        Debug.Log("Lesson25_Test测试类的 构造函数");
    }

    public void Speak(string str)
    {
        Debug.Log("测试类说话:" + str);
    }

    ~Lesson25_Test()
    {

    }
}


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

×

喜欢就点赞,疼爱就打赏