XLua Lua访问C#中的方法(四)访问委托、事件

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

委托

在使用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


在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值