UH2S2L17——Lua调用委托和事件

调用委托

  • 委托在Lua中和C#中商业差不多,唯一需要注意的是,当委托为空时不能直接加,要用=​,之后才能加
  • 事件的方法加减需要使用这种格式对象:事件名("+/-", 函数变量)​,且不能直接清空,必须要在C#类里执行实现清空方法再通过Lua调用

先在C#脚本内声明如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Lesson7
{
//申明委托和事件
public UnityAction del;

public event UnityAction eventAction;

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

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

向委托添加函数

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

1
2
3
4
5
6
7
8
9
10
11
12
local obj = CS.Lesson7()

local fun = function()
print("Lua函数Fun")
end

-- obj.del = obj.del + fun --第一次不能直接+
obj.del = fun
obj.del = obj.del + function()
print("临时申明的函数")
end --类似于添加匿名函数,不建议用,因为无法直接移除
obj.del()

image

向委托移除函数

向委托移除方法也和简单,直接减-​即可,这也是为什么尽可能不使用匿名函数的原因,因为无法直接移除,只能清空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
print("*********开始加函数***********")
-- obj.del = obj.del + fun --第一次不能直接+
obj.del = fun
obj.del = obj.del + fun
obj.del = obj.del + function()
print("临时申明的函数")
end --类似于添加匿名函数,不建议用,因为无法直接移除
obj.del()

print("*********开始减函数***********")
obj.del = obj.del - fun
obj.del = obj.del - fun
--委托执行
obj.del()

image

清空函数

清空直接将委托赋值为nil​即可

1
2
3
4
-- 清空
obj.del = nil
obj.del = fun
obj.del()

image

调用事件

事件添加函数

事件加减函数,和委托非常不一样
lua中使用C#事件加函数,有点类似使用成员方法,类似于对象:事件名("+", 函数变量)

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

obj:eventAction("+", fun2)
obj:eventAction("+", fun2)
obj:eventAction("+", function()
print("事件加的匿名函数")
end) --类似于添加匿名函数,不建议用,因为无法直接移除
obj:DoEvent()

image

事件移除函数

移除方法也很简单

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

print("*********开始加函数***********")
obj:eventAction("+", fun2)
obj:eventAction("+", fun2)
obj:eventAction("+", function()
print("事件加的匿名函数")
end) --类似于添加匿名函数,不建议用,因为无法直接移除
obj:DoEvent()

print("*********开始减函数***********")
obj:eventAction("-", fun2)
obj:DoEvent()

image

清空事件

清事件,不能直接设置为nil​,因为事件一般不能让外部去清空,
因此我们需要在C#类内部自行声明清空方法,然后让外部调用这个方法

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

public event UnityAction eventAction;

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

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