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