17.Lua调用CSharp-委托和事件
17.1 知识点
准备工作
启动Lua脚本
LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson17_Lua调用CSharp_委托和事件");
定义有事件和委托的测试类
public class Lesson17_Test
{
//申明委托和事件
public UnityAction myDelegate;
public event UnityAction myEvent;
public void DoDelegate()
{
if (myDelegate != null)
myDelegate();
}
public void ClearDelegate()
{
myDelegate = null;
}
public void DoEvent()
{
if (myEvent != null)
myEvent();
}
public void ClearEvent()
{
myEvent = null;
}
}
在Lua脚本实例化测试类和几个测试用的函数
--需要添加类到CustomSetting
local test = Lesson17_Test()
--声明几个Lua函数用于测试
local luaFunction1 = function()
print("我是Lua函数1")
end
local luaFunction2 = function()
print("我是Lua函数2")
end
委托
--委托是用来装函数的 在Lua使用C#中的委托 是用来装lua函数的
--委托加减函数
--Lua中没有复合运算符 不能+= -=
--委托中加函数 如果委托还是nil 不能直接+ 要先=赋值函数 之后加函数在使用+
--空的委托直接+函数报错
-- test.myDelegate = test.myDelegate + luaFunction1 --报错 attempt to perform arithmetic on a nil value (field 'myDelegate')
--空的委托要先=函数
test.myDelegate = luaFunction1
--toLua不能直接执行委托 需要在C#用方法封装后调用方法
-- test.myDelegate() --报错
test:DoDelegate() --我是Lua函数1
--非空的委托直接+函数
test.myDelegate = test.myDelegate + luaFunction2
--执行委托
test:DoDelegate() --我是Lua函数1 我是Lua函数2
--往委托中加函数时可以使用匿名函数 但是不建议这样写 因为委托减函数的时候无法指定匿名函数
test.myDelegate = test.myDelegate + function()
print("我是Lua匿名函数")
end
--执行委托
test:DoDelegate() --我是Lua函数1 我是Lua函数2 我是Lua匿名函数
--可以减掉装载的函数 不能减掉匿名函数
test.myDelegate = test.myDelegate - luaFunction1
test.myDelegate = test.myDelegate - luaFunction2
--执行委托
test:DoDelegate() --我是Lua匿名函数
--委托清空 也可以调用C#封装的事件
test.myDelegate = nil
-- test.myDelegate()--执行空委托报错 attempt to call a nil value (field 'myDelegate')
--委托清空过后 空的委托要先=函数
test.myDelegate = luaFunction1
--执行委托
test:DoDelegate() --我是Lua函数1
事件
--toLua事件的用法几乎和toLua委托一致 和xLua很不一样
--给事件加两个函数
--直接=设置事件的函数会报错 只能进行 + -
-- test.myEvent = luaFunction1-- 报错
test.myEvent = test.myEvent + luaFunction1
test.myEvent = test.myEvent + luaFunction2
--调用C#封装的事件方法执行事件
test:DoEvent()--我是Lua函数1 我是Lua函数2
--匿名函数
test.myEvent = test.myEvent + function()
print("我是Lua匿名函数")
end
--调用C#封装的事件方法执行事件
test:DoEvent()--我是Lua函数1 我是Lua函数2 我是Lua匿名函数
--可以减掉装载的函数 不能减掉匿名函数
test.myEvent = test.myEvent - luaFunction1
test.myEvent = test.myEvent - luaFunction2
--调用C#封装的事件方法执行事件
test:DoEvent()--我是Lua匿名函数
--事件清空 不能直接置空 要在C#封装置空事件的函数再在Lua调用
-- test.myEvent = nil--报错
test:ClearEvent()
--调用c#封装的事件方法执行事件
test:DoEvent()--没有报错
17.2 知识点代码
Lesson17_Lua调用CSharp_委托和事件.lua
print('我是Lua脚本 Lesson17_Lua调用CSharp_委托和事件')
--需要添加类到CustomSetting
local test = Lesson17_Test()
--声明几个Lua函数用于测试
local luaFunction1 = function()
print("我是Lua函数1")
end
local luaFunction2 = function()
print("我是Lua函数2")
end
print("**********知识点一 委托************")
--委托是用来装函数的 在Lua使用C#中的委托 是用来装lua函数的
--委托加减函数
--Lua中没有复合运算符 不能+= -=
--委托中加函数 如果委托还是nil 不能直接+ 要先=赋值函数 之后加函数在使用+
--空的委托直接+函数报错
-- test.myDelegate = test.myDelegate + luaFunction1 --报错 attempt to perform arithmetic on a nil value (field 'myDelegate')
--空的委托要先=函数
test.myDelegate = luaFunction1
--toLua不能直接执行委托 需要在C#用方法封装后调用方法
-- test.myDelegate() --报错
test:DoDelegate() --我是Lua函数1
--非空的委托直接+函数
test.myDelegate = test.myDelegate + luaFunction2
--执行委托
test:DoDelegate() --我是Lua函数1 我是Lua函数2
--往委托中加函数时可以使用匿名函数 但是不建议这样写 因为委托减函数的时候无法指定匿名函数
test.myDelegate = test.myDelegate + function()
print("我是Lua匿名函数")
end
--执行委托
test:DoDelegate() --我是Lua函数1 我是Lua函数2 我是Lua匿名函数
--可以减掉装载的函数 不能减掉匿名函数
test.myDelegate = test.myDelegate - luaFunction1
test.myDelegate = test.myDelegate - luaFunction2
--执行委托
test:DoDelegate() --我是Lua匿名函数
--委托清空 也可以调用C#封装的事件
test.myDelegate = nil
-- test.myDelegate()--执行空委托报错 attempt to call a nil value (field 'myDelegate')
--委托清空过后 空的委托要先=函数
test.myDelegate = luaFunction1
--执行委托
test:DoDelegate() --我是Lua函数1
print("**********知识点二 事件************")
--toLua事件的用法几乎和toLua委托一致 和xLua很不一样
--给事件加两个函数
--直接=设置事件的函数会报错 只能进行 + -
-- test.myEvent = luaFunction1-- 报错
test.myEvent = test.myEvent + luaFunction1
test.myEvent = test.myEvent + luaFunction2
--调用C#封装的事件方法执行事件
test:DoEvent()--我是Lua函数1 我是Lua函数2
--匿名函数
test.myEvent = test.myEvent + function()
print("我是Lua匿名函数")
end
--调用C#封装的事件方法执行事件
test:DoEvent()--我是Lua函数1 我是Lua函数2 我是Lua匿名函数
--可以减掉装载的函数 不能减掉匿名函数
test.myEvent = test.myEvent - luaFunction1
test.myEvent = test.myEvent - luaFunction2
--调用C#封装的事件方法执行事件
test:DoEvent()--我是Lua匿名函数
--事件清空 不能直接置空 要在C#封装置空事件的函数再在Lua调用
-- test.myEvent = nil--报错
test:ClearEvent()
--调用c#封装的事件方法执行事件
test:DoEvent()--没有报错
Lesson17_Lua调用CSharp_委托和事件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class Lesson17_Lua调用CSharp_委托和事件 : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson17_Lua调用CSharp_委托和事件");
}
}
public class Lesson17_Test
{
//申明委托和事件
public UnityAction myDelegate;
public event UnityAction myEvent;
public void DoDelegate()
{
if (myDelegate != null)
myDelegate();
}
public void ClearDelegate()
{
myDelegate = null;
}
public void DoEvent()
{
if (myEvent != null)
myEvent();
}
public void ClearEvent()
{
myEvent = null;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com