UH2S2L14——Lua调用拓展方法

本章代码关键字

1
[LuaCallCSharp]            //声明拓展方法的类必须要加上该类才能在Lua中调用,而其他Lua会调用的类也可以使用该特性,可提升性能

调用拓展方法

在Lua中调用拓展方法和使用成员方法是一致的,
但前提是,需要为拓展方法所在的类需要使用 [LuaCallCSharp]特性,并生成代码Generate Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[LuaCallCSharp]
public static class Tools
{
public static void Move(this Lesson4 obj)
{
Debug.Log(obj.name + "移动");
}
}

public class Lesson4
{
public string name = "唐老狮";
public void Speak(string str)
{
Debug.Log(str);
}

public static void Eat()
{
Debug.Log("吃东西");
}
}

之后就可以在Lua里如调用成员方法一般直接调用拓展方法了

1
2
3
4
5
6
7
Lesson4 = CS.Lesson4
Lesson4.Eat()

local obj = Lesson4()
obj:Speak("唐老狮哈哈哈哈哈")

obj:Move()

image

[LuaCallCSharp]特性

想要在Lua中使用拓展方法,一定要在工具类前面加上该特性
但是,建议使用在Lua中要使用的类,全部加上该特性,可以提升性能
虽然不加该特性,除了拓展方法对应的类,其它类的使用都不会报错
但是这样lua就是通过反射的机制去调用的C#的类,效率较低

该特性有不在类声明前添加也可以使用的方法,对不能直接修改代码的类也有效,详见:让系统类型和Lua能互相访问

1
2
3
4
5
6
7
8
9
[LuaCallCSharp]
public static class Tools
{
//Lesson4的拓展方法
public static void Move(this Lesson4 obj)
{
Debug.Log(obj.name + "移动");
}
}