ToLua中委托在lua中添加和移除事件

创建一个事件监听类,并把它添加到wrap中,让lua可以访问到它。

using UnityEngine;
using System;
using System.Collections;
using LuaInterface;

public sealed class TestEventListener : MonoBehaviour
{
    public delegate void VoidDelegate(GameObject go);
    public delegate void OnClick(GameObject go); 
       
    public OnClick onClick = delegate { };

    public event OnClick onClickEvent = delegate { };

    [NoToLuaAttribute]
    public void OnClickEvent(GameObject go)
    {
        onClickEvent(go);
    }
}


在lua中对onClick和onClickEvent进行添加和删除事件

--listener为上面的那个类
function DoClick1(go)                
    print('click1 gameObject is '..go.name)                    
end

function AddClick1(listener) --给委托添加事件      
    if listener.onClick then
        listener.onClick = listener.onClick + DoClick1                                                    
    else
        listener.onClick = DoClick1                      
    end                
end

function RemoveClick1(listener) --给委托移除事件
    if listener.onClick then
        listener.onClick = listener.onClick - DoClick1      
    else
        print('empty delegate')
    end
end

function TestEvent()
    print('this is a event')
end

function AddEvent(listener)--事件添加事件
    listener.onClickEvent = listener.onClickEvent + TestEvent
end

function RemoveEvent(listener)--事件移除事件
    listener.onClickEvent = listener.onClickEvent - TestEvent
end

local t = {name = 'byself'}
function t:TestSelffunc()
    print('callback with self: '..self.name)
end       

function AddSelfClick(listener)
    if listener.onClick then
        listener.onClick = listener.onClick + TestEventListener.OnClick(t.TestSelffunc, t)
    else
        listener.onClick = TestEventListener.OnClick(t.TestSelffunc, t)
    end   
end     

function RemoveSelfClick(listener)
    if listener.onClick then
        listener.onClick = listener.onClick - TestEventListener.OnClick(t.TestSelffunc, t)
    else
        print('empty delegate')
    end   
end


c#中获取lua方法为委托添加或删除事件

LuaFunction func = state.GetFunction("DoClick1");
TestEventListener.OnClick onClick = (TestEventListener.OnClick)DelegateTraits<TestEventListener.OnClick>.Create(func);
listener.onClick += onClick;

LuaFunction func = state.GetFunction("DoClick1");
listener.onClick = (TestEventListener.OnClick)DelegateFactory.RemoveDelegate(listener.onClick, func);
func.Dispose();
func = null;

首页 我的博客
粤ICP备17103704号