4.委托的调用
接这上次的我们继续,这次在Lua中访问调用委托,由于委托类型和泛型一样,都是C#中的,Lua中没有,所以很难直接访问,没有找到较好的方法,这里我建议在C#中提前为了热更新方案先写好委托操作的相关函数,代码如下
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public delegate void DelegateTestHandler();//委托测试
[Hotfix]
public class NewTest : MonoBehaviour
{
public GameObject[] go1;
public List<int> bb;
void Start()
{
go1 = new GameObject[3] { new GameObject("111"), new GameObject("222"), new GameObject("333") };
bb = new List<int>() { 1, 2 };
}
[LuaCallCSharp]
public void Update()
{
print("??");
DelegateTest();
}
public void ArrayTest()//数组测试
{
print(go1[0].name);
//在Lua我们在创建一个对象数组TODO...
}
public void GenericTest()//泛型测试
{
AA<int> aa = new AA<int>();
aa.ShowTpyeName();
print(bb[0] + " " + aa.GetType());
//我们在Lua中创建一个泛型
}
public void VariableParams(params string[] aa)//不定参数测试
{
print(aa[0] + " " + aa[1]);
}
//委托测试
public DelegateTestHandler test;
public void DelegateTest()
{
AddListener(DD);
AddListener(EE);
test();
}
public void DD()
{
print("我是C#中委托调用的方法");
}
public void EE()
{
print("我也不知道对不对");
}
public void AddListener(DelegateTestHandler a)//提前写好的订阅委托的方法,供交互使用
{
test += a;
}
public void ReduceListender(DelegateTestHandler a)//提前写好的取消订阅委托的方法,供交互使用
{
test -= a;
}
}
[LuaCallCSharp]
public class AA<T>
{
public void ShowTpyeName()
{
Debug.Log(typeof(T).Name);
}
}
然后是Lua代码
xlua.hotfix(CS.NewTest,"DelegateTest",
function(self)
self:AddListener(Call_1)
self.test();
end)
function Call_1()
print("我是在Lua中委托调用的方法1")
end
function Call_2()
print("我是在Lua中委托调用的方法2")
end
自认为这种方法还算可行,运行是发现掉帧严重,因为在Update执行的,已知在订阅委托方法,所以大家不用担心这里
注意:事件也是的调用也是和委托一样的操作方式,提前写好方法供交互使用
5.扩展方法的调用
这里很简单,没什么好说的,就和调用普通方法一样
C#代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public delegate void DelegateTestHandler();//委托测试
[Hotfix]
public class NewTest : MonoBehaviour
{
public GameObject[] go1;
public List<int> bb;
public NewTest newTest;
void Start()
{
go1 = new GameObject[3] { new GameObject("111"), new GameObject("222"), new GameObject("333") };
bb = new List<int>() { 1, 2 };
newTest = new NewTest();
}
[LuaCallCSharp]
public void Update()
{
print("??");
InstanceTest();
}
//-----------------------------------------------------数组测试
public void ArrayTest()
{
print(go1[0].name);
//在Lua我们在创建一个对象数组TODO...
}
//---------------------------------------------------泛型测试
public void GenericTest()
{
AA<int> aa = new AA<int>();
aa.ShowTpyeName();
print(bb[0] + " " + aa.GetType());
//我们在Lua中创建一个泛型
}
//-----------------------------------------------------不定参数测试
public void VariableParams(params string[] aa)
{
print(aa[0] + " " + aa[1]);
}
//------------------------------------------------------委托测试
public DelegateTestHandler test;
public void DelegateTest()
{
AddListener(DD);
AddListener(EE);
test();
}
public void DD()
{
print("我是C#中委托调用的方法");
}
public void EE()
{
print("我也不知道对不对");
}
public void AddListener(DelegateTestHandler a)//提前写好的订阅委托的方法,供交互使用
{
test += a;
}
public void ReduceListender(DelegateTestHandler a)//提前写好的取消订阅委托的方法,供交互使用
{
test -= a;
}
//--------------------------------------------扩展方法测试
public void ExtentionTest()
{
//在Lua中调用扩展方法
}
//--------------------------------------------单例模式测试
public void InstanceTest()
{
print(Package.Instance.gameObject.name);//这是我当前工程下的一个单利模式
//在Lua中调用单例模式
}
//字典测试
//里氏转换测试
//携程测试
}
[LuaCallCSharp]
public class AA<T>
{
public void ShowTpyeName()
{
Debug.Log(typeof(T).Name);
}
}
[LuaCallCSharp]
public static class ExtentionMethod
{
public static void ExTest(this ZZ test)
{
Debug.Log("我是扩展方法");
}
}
[LuaCallCSharp]
public class ZZ
{
public void ZZMethod()
{
Debug.Log("我是成员函数");
}
}
Lua代码如下:
--调用扩展方法时候,相关类记得都打上标签
xlua.hotfix(CS.NewTest,"ExtentionTest",
function(self)
local ZZ=CS.ZZ
local aa=ZZ()
aa:ExTest()
print("调用扩展方法成功")
aa:ZZMethod()
end)
6.单例模式的调用
同样很简单,C#代码:
//--------------------------------------------单例模式测试
public void InstanceTest()
{
print(Package.Instance.gameObject.name);//这是我当前工程下的一个单利模式
//在Lua中调用单例模式
}
Lua代码:
xlua.hotfix(CS.NewTest,"InstanceTest",
function(self)
local name=CS.Package.Instance.gameObject.name;
print(name)
end)