委托
在使用Lua代码访问C#委托时需要注意,访问委托类型的方式与访问静态变量的方式相同,
访问(静态/非静态)委托的变量的方式与访问(静态/非静态)成员变量的方式相同
由于在Lua中没有"+=“和”-=“操作符,在增加委托链的时候只能使用”+“和”-"操作符
using UnityEngine;
using XLua;
[LuaCallCSharp]
public class DelegateClass
{
public delegate void ActionString(string arg);
public ActionString actionString1;
public void AddAction(ActionString action)
{
Debug.Log("添加了一个委托");
this.actionString1 = action;
actionString1("C# Call");
}
public ActionString actionString10 = (arg) =>
{
Debug.Log("actionString10:" + arg);
};
public ActionString actionString11 = (arg) =>
{
Debug.Log("actionString11:" + arg);
};
public ActionString actionString12 = (arg) =>
{
Debug.Log("actionString12:" + arg);
};
}
print('启动了Lua')
function init()
print("执行了Lua的全局方法init")--无参数的方法
CreatUnityObj()
end
function CreatUnityObj()
local DelegateClass= CS.DelegateClass()
--单独增加一个委托并且,回调了funCallBack方法
DelegateClass:AddAction(funCallBack)
local actionString10 = DelegateClass.actionString10
actionString10('Lua输入了actionString10')
actionString10=actionString10+DelegateClass.actionString11+DelegateClass.actionString12
actionString10('Lua调用了委托链')
actionString10=actionString10-DelegateClass.actionString11
actionString10('Lua删除了一个委托链中的11')
end
function funCallBack(arg)
print('funCallBack:',arg)
end


| 事件 | |
|---|---|
在访问C#事件的时候需要生成代码,所以必须要为事件的委托类型加上一个Attribute:
[CSharpCallLua],关于为什么这里需要加[CSharpCallLua]而不是[LuaCallCSharp],
GitHub:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md#luacallsharp以及csharpcalllua
看调用者和被调用者,比如要在lua调用C#的GameObject.Find函数,或者调用gameobject的实例方法,属性等,GameObject类要加LuaCallSharp,而想把一个lua函数挂到UI回调,这是调用者是C#,被调用的是一个lua函数,所以回调声明的delegate要加CSharpCallLua。
有时会比较迷惑人,比如List.Find(Predicate match)的调用,List当然是加LuaCallSharp,而Predicate却要加CSharpCallLua,因为match的调用者在C#,被调用的是一个lua函数。
更无脑一点的方式是看到“This delegate/interface must add to CSharpCallLua : XXX”,就把XXX加到CSharpCallLua即可
同时在添加和移除事件的时候应该使用以下的方式
object:event("+", delegate)
object:event("-", delegate)
using UnityEngine;
using XLua;
[LuaCallCSharp]
public class EventClass
{
[CSharpCallLua]
public delegate void TestDelegate();
public event TestDelegate Events;
public TestDelegate action1 = () =>
{
Debug.Log("触发了action1");
};
public TestDelegate action2 = () =>
{
Debug.Log("触发了action2");
};
public void TriggerEvent()
{
Events();
}
}
print('启动了Lua')
function init()
print("执行了Lua的全局方法init")--无参数的方法
CreatUnityObj()
end
function CreatUnityObj()
local eventClass=CS.EventClass()
--添加和移除事件的时候应该使用以下的方式
--object:event("+", delegate)
--object:event("-", delegate)
eventClass:Events("+",eventClass.action1)
eventClass:Events("+",eventClass.action2)
eventClass:Events("+",luaFunction)
--注意在Lua中不能通过以下方式来触发事件eventClass:Events()
--触发事件
eventClass:TriggerEvent()
end
function luaFunction()
print('我是Lua中的方法')
end


本文详细介绍了如何在XLua框架下,使用Lua代码访问C#中的委托和事件。强调了在Lua中操作委托链时需使用 '+' 和 '-' 操作符,并指出访问C#事件时需为委托类型添加[CSharpCallLua]特性。同时解释了[CSharpCallLua]和[LuaCallCSharp]的区别,以及在不同场景下何时使用它们。对于理解Lua与C#的交互,特别是委托和事件的使用,具有指导意义。
访问委托、事件&spm=1001.2101.3001.5002&articleId=89298623&d=1&t=3&u=0968ad9b540a426d95de1e13b8cb1f11)
272

被折叠的 条评论
为什么被折叠?



