找回密码
 立即注册
查看: 250|回复: 0

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

[复制链接]
发表于 2021-8-11 17:30 | 显示全部楼层 |阅读模式
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)
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 07:49 , Processed in 0.088597 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表