在一开始,我们想来创建一个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 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()
{
GenericTest();
}
public void ArrayTest()//数组测试
{
print(go1[0].name);
//在Lua我们在创建一个对象数组TODO...
}
public void GenericTest()//泛型测试
{
AA aa = new AA();
aa.ShowTpyeName();
print(bb[0]+" "+ aa.GetType());
//我们在Lua中创建一个泛型
}
}
[LuaCallCSharp]
public class AA
{
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没有泛型,实现还需要反射代价昂贵,也比较笨重
3.可变参数函数的调用
这种比较简单,老规矩想看C#代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
[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()
{
VariableParams("111", "222");
}
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]);
}
}
[LuaCallCSharp]
public class AA
{
public void ShowTpyeName()
{
Debug.Log(typeof(T).Name);
}
}
再来看Lua的
xlua.hotfix(CS.NewTest,"Update",
function(self)
self:VariableParams("111","222")
end)
类型还有很多很多,今天先更这三种的,过两天继续更新,希望可以帮助到大家