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