UH2S3L16——Lua调用委托和事件

Lua调用C#的委托和事件

假设我们要调用下面的委托和事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Lesson7
{
//申明委托和事件
public UnityAction del;

public event UnityAction eventAction;

public void DoDel()
{
del?.Invoke();
}

public void DoEvent()
{
if (eventAction != null)
eventAction();
}

public void ClearEvent()
{
eventAction = null;
}
}

委托中加函数

委托是用来装函数的,使用C#中的委托 就是用来装lua函数的

Lua中没有复合运算符,不能用+=​,如果第一次往委托中加函数 因为是nil​不能直接+​,所以第一次要先=

1
2
3
4
5
6
7
8
9
10
local obj = Lesson7()
local fun = function()
print("Lua函数Fun")
end

obj.del = fun
obj.del = obj.del + fun
obj.del = obj.del + function()
print("临时申明的函数")
end

和xLua不同,toLua不能直接执行委托中函数,必须要绕一个弯,在C#中封装一个执行委托的方法,然后再toLua中调用才行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Lesson7
{
//申明委托和事件
public UnityAction del;

public event UnityAction eventAction;

public void DoDel()
{
del?.Invoke();
}

public void DoEvent()
{
if (eventAction != null)
eventAction();
}

public void ClearEvent()
{
eventAction = null;
}
}
1
obj:DoDel()

image

委托中减函数

委托减函数很简单,直接使用-​即可

1
2
3
obj.del = obj.del - fun()
obj.del = obj.del - fun()
obj:DoDel()

image

清空委托函数

委托清空函数很简单,直接赋值为nil​即可

1
2
3
4
obj.del = nil
obj:DoDel()
obj.del = fun
obj:DoDel()

image

事件中加函数

和xLua不同,toLua事件中加函数和委托方式一样,
但是要注意obj.eventAction​直接赋值会报错,因为C#中不能直接为事件赋值,只能+=​,-=

因此,toLua中事件不需要用=​,直接+​或者-​即可

1
2
3
4
5
6
7
8
9
local fun2 = function()
print("事件加的函数")
end

obj.eventAction = obj.eventAction + fun2
obj.eventAction = obj.eventAction + function()
print("事件加的匿名函数")
end
obj.DoEvent()

image

事件中减函数

事件减函数很简单,直接使用-​即可

1
2
obj.eventAction = obj.eventAction - fun2
obj:DoEvent()

image

事件中清空函数

事件清空函数不能直接赋值为nil​,因此调用C#中的Clear​方法即可

1
2
obj:ClearEvent()
obj:DoEvent()