Unity C#与Xlua的交互 Lua调用C# LuaCallCSharp

继上篇的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值