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 = fun obj.del = obj.del + function()     print("临时申明的函数") end                                  obj.del()
   | 
 

向委托移除函数
向委托移除方法也和简单,直接减-即可,这也是为什么尽可能不使用匿名函数的原因,因为无法直接移除,只能清空
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | print("*********开始加函数***********")
  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()
  | 
 

清空函数
清空直接将委托赋值为nil即可
1 2 3 4
   |  obj.del = nil obj.del = fun obj.del()
 
  | 
 

调用事件
事件添加函数
事件加减函数,和委托非常不一样
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()
   | 
 

事件移除函数
移除方法也很简单
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()
   | 
 

清空事件
清事件,不能直接设置为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()
   |