JoshWindsor 发表于 2021-8-11 17:30

XLUA与(Unity中)C#所有类型交互实例大全--2

4.委托的调用
接这上次的我们继续,这次在Lua中访问调用委托,由于委托类型和泛型一样,都是C#中的,Lua中没有,所以很难直接访问,没有找到较好的方法,这里我建议在C#中提前为了热更新方案先写好委托操作的相关函数,代码如下
using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using XLua;public delegate void DelegateTestHandler();//委托测试public class NewTest : MonoBehaviour{    public GameObject[] go1;    public List<int> bb;    void Start()    {      go1 = new GameObject { new GameObject("111"), new GameObject("222"), new GameObject("333") };      bb = new List<int>() { 1, 2 };    }        public void Update()    {      print("??");      DelegateTest();    }    public void ArrayTest()//数组测试    {      print(go1.name);      //在Lua我们在创建一个对象数组TODO...    }    public void GenericTest()//泛型测试    {      AA<int> aa = new AA<int>();      aa.ShowTpyeName();      print(bb + " " + aa.GetType());      //我们在Lua中创建一个泛型    }    public void VariableParams(params string[] aa)//不定参数测试    {      print(aa + " " + aa);    }    //委托测试    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 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();//委托测试public class NewTest : MonoBehaviour{    public GameObject[] go1;    public List<int> bb;    public NewTest newTest;    void Start()    {      go1 = new GameObject { new GameObject("111"), new GameObject("222"), new GameObject("333") };      bb = new List<int>() { 1, 2 };      newTest = new NewTest();    }        public void Update()    {      print("??");      InstanceTest();    }    //-----------------------------------------------------数组测试    public void ArrayTest()    {      print(go1.name);      //在Lua我们在创建一个对象数组TODO...    }    //---------------------------------------------------泛型测试    public void GenericTest()    {      AA<int> aa = new AA<int>();      aa.ShowTpyeName();      print(bb + " " + aa.GetType());      //我们在Lua中创建一个泛型    }    //-----------------------------------------------------不定参数测试    public void VariableParams(params string[] aa)    {      print(aa + " " + aa);    }    //------------------------------------------------------委托测试    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中调用单例模式    }    //字典测试    //里氏转换测试    //携程测试}public class AA<T>{    public void ShowTpyeName()    {      Debug.Log(typeof(T).Name);    }}public static class ExtentionMethod{    public static void ExTest(this ZZ test)    {      Debug.Log("我是扩展方法");    }}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)
页: [1]
查看完整版本: XLUA与(Unity中)C#所有类型交互实例大全--2