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();//委托测试
[Hotfix]
public class NewTest : MonoBehaviour
{
    public GameObject[] go1;
    public List bb;
    void Start()
    {
        go1 = new GameObject[3] { new GameObject("111"), new GameObject("222"), new GameObject("333") };
        bb = new List() { 1, 2 };
    }

    [LuaCallCSharp]
    public void Update()
    {
        print("??");
        DelegateTest();
    }


    public void ArrayTest()//数组测试
    {
        print(go1[0].name);

        //在Lua我们在创建一个对象数组TODO...
    }

    public void GenericTest()//泛型测试
    {
        AA aa = new AA();

        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
{
    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 bb;
    public NewTest newTest;
    void Start()
    {
        go1 = new GameObject[3] { new GameObject("111"), new GameObject("222"), new GameObject("333") };
        bb = new List() { 1, 2 };
        newTest = new NewTest();
    }

    [LuaCallCSharp]
    public void Update()
    {
        print("??");
        InstanceTest();
    }

    //-----------------------------------------------------数组测试
    public void ArrayTest()
    {
        print(go1[0].name);

        //在Lua我们在创建一个对象数组TODO...
    }

    //---------------------------------------------------泛型测试
    public void GenericTest()
    {
        AA aa = new AA();

        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
{
    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)

 

你可能感兴趣的:(XLUA与(Unity中)C#所有类型交互实例大全--2)