继上篇的C#调用Lua之后,这篇主要记录Unity中使用XLua是如何在Lua代码中调用C#代码的。相关的文档资料与上篇相同,这里就不赘述了。除了官方的Demo,自己也加了个小demo,对应文章的内容,在MyExamples目录下的LuaCallCSharp。
LuaCallCSharp
备注:Lua Call C#代码的时候,C#处生成的代码基本都需要打标签[LuaCallCSharp]。关于标签的理解,将在后面的文章详细讲解。
1. new 一个C#对象
我们在C#中生成一个对象,比如GameObject,代码如下:
GameObject go = new GameObject();
那么Lua是怎么写的呢?如下:
local go = CS.UnityEngine.GameObject()
知识点:首先在Lua中没有new关键字,所以新建对象的时候直接省略new即可,其次所有C#相关的都要加上前缀"CS."包括构造函数,静态成员属性、方法。同时别忘了加上命名空间namespace。所以C#的GameObject类,在Lua中就是CS.UnityEngine.GameObject。
当class有多个构造函数时,xlua中也支持重载,如GameObject有一个带一个string参数的重载用于给该GameObject命名,对应的Lua实现如下:
local go = CS.UnityEngine.GameObject('helloworld')
2.访问C#静态属性、方法
由上面我们可以知道Lua中调用GameObject的类为CS.UnityEngine.GameObject,那么如果想调用GameObject中的静态方法,比如Find(string),如下:
local go = CS.UnityEngine.GameObject.Find('helloworld')
访问静态属性也是同理,比如:
CS.UnityEngine.Time.deltaTime
--赋值
CS.UnityEngine.Time.timeScale = 0.5
建议:需要经常访问的类,可以先用局部变量引用后访问,即可以减少代码量,还可以提高性能,如:
local GameObject = CS.UnityEngine.GameObject
--使用的时候
GameObject.Find('helloworld')
GameObject.FindGameObjectsWithTag("tag")
3.访问C#成员属性、方法
与C#一样,访问成员属性方法的时候,需要通过类的实例去访问。
假设我们在C#中定义了如下类:
namespace MyExamples {
[LuaCallCSharp]
public class Test {
public int index;
public int Add(int a, int b) {
return a + b;
}
}
}
那么对应的Lua即:
local Test = CS.MyExamples.Test;
local test = Test();
test.index = 66;
print('test.index---'..test.in