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

在一开始,我们想来创建一个C#代码,作为与Lua交互使用,就命名为NewTest好了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

[Hotfix]
public class NewTest : MonoBehaviour {
    
    void Start () {
        
    }
	
    [LuaCallCSharp]
	public void Update () {

	}

}

打好hotfix和LuaCallCSharp的标签,方便一会儿使用

再创建一个Lua脚本,在C#中用自定义Loader加载创建好的Lua脚本(怎么加载很多教程都有,我这里就不说了,可以执行百度)

1.访问/创建C#中的数组

我们在C#中的NewTest中创建一个名为ArrayTest的方法,在Update中调用方便Debug,并在创建一个GameObject的数组在Start中初始化

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

[Hotfix]
public class NewTest : MonoBehaviour {
    public GameObject[] go1;

    void Start () {

       go1 = new GameObject[3] { new GameObject("111"), new GameObject("222"), new GameObject("333") };
    }
	
    [LuaCallCSharp]
	public void Update () {
        ArrayTest();

    }

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

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




}

接着是Lua代码

local UnityEngine=CS.UnityEngine
local System=CS.System


xlua.hotfix(CS.NewTest,"ArrayTest",
function(self)
	print(self.go1[0].name)--访问C#中的GameObject数组
	--自己创建一个GameObject数组
	local c_GameObject={}
	c_GameObject[1]=UnityEngine.GameObject("新的");
	print("我是在Lua中创建的",c_GameObject[1])
end)

就这么简单就完成了,在Lua中创建数组其实就是创建表,表几乎能装下C#中的任何类型。

2.访问/创建泛型

我们再到C#代码中增加如下需要使用的东西

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

[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()
    {
        GenericTest();
        
    }


    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中创建一个泛型
    }

}

[LuaCallCSharp]
public class AA<T>
{
    public void ShowTpyeName()
    {
        Debug.Log(typeof(T).Name);
    }
}

接着我们在添加Lua代码

xlua.hotfix(CS.NewTest,"GenericTest",
function(self)
	--创建AA的泛型类对象  要先用GetType()获取泛型类的名称,放到下面的字符串中
	--不过此方法笨重代价过大,也暂时找不到什么好方法了
	local aa=CS.System.Activator.CreateInstance(CS.System.Type.GetType("AA`1[System.Int32]"))
	aa:ShowTpyeName();--调用泛型类中的方法


	--访问泛型类
	for i=1,self.bb.Count do--访问List
		print(i)
	end
end)

访问List比较容易,就像数组操作一样,当创建List就不那么容易了,毕竟Lua没有泛型,实现还需要反射代价昂贵,也比较笨重

扫描二维码关注公众号,回复: 2500468 查看本文章

3.可变参数函数的调用

这种比较简单,老规矩想看C#代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

[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()
    {
        VariableParams("111", "222");
        
    }


    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]);
    }
}

[LuaCallCSharp]
public class AA<T>
{
    public void ShowTpyeName()
    {
        Debug.Log(typeof(T).Name);
    }
}

再来看Lua的

xlua.hotfix(CS.NewTest,"Update",
function(self)
	self:VariableParams("111","222")
end)

类型还有很多很多,今天先更这三种的,过两天继续更新,希望可以帮助到大家

猜你喜欢

转载自blog.csdn.net/w199753/article/details/81215989