创建一个事件监听类,并把它添加到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;