|
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")endfunction 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) |
|