这是我第二次写博客了,想想还有点小激动!
学习NGUI一段时间了,这几天心血来潮的对NGUi的事件监听的由来比较感兴趣。然后花了点时间看了一下,有种原来如此的感觉。
我先写一段NGUI事件监听的代码:
public class NGUIClickTest : MonoBehaviour {
// Use this for initialization
void Start () {
UIEventListener.Get (gameObject).onClick = DebugLog;
}
// Update is called once per frame
void Update () {
}
void DebugLog(GameObject obj){
Debug.Log ("NGUI EventListener " + obj.name);
}
}
这是一个简单的事件监听。 其实NGUI的事件原理还是挺简单的,看看NGUI是怎么实现事件监听的,我简单的来看看onClick是怎么实现的。我写了一段简单实现onClick的代码
public class MyEventTrigger : MonoBehaviour {
public delegate void VoidDelegate (GameObject go);
public VoidDelegate onClick;
void OnClick () { if (onClick != null) onClick(gameObject); }
static public MyEventTrigger Get (GameObject go)
{
MyEventTrigger listener = go.GetComponent<MyEventTrigger>();
if (listener == null) listener = go.AddComponent<MyEventTrigger>();
return listener;
}
}
再来一个触发的脚本:
public class MyEventClickTest : MonoBehaviour {
// Use this for initialization
void Start () {
MyEventTrigger.Get (gameObject).onClick = MyClick;
}
// Update is called once per frame
void Update () {
}
void MyClick(GameObject obj){
Debug.Log ("MyEventTrigger " + obj.name);
}
}
事实证明是ok的。原理很简单
我们通过MyEventTrigger 的get函数,将我要点击触发的函数 MyClick加到要触发对象的委托上去了。如下图所示,
其中标1 的是 获取 对象上的组件,没有就自己添加,标2 的是我申明的委托,我们之间把点击触发的函数的就是加到这个委托中去的,然后通过标 3 的 OnClick函数去触发执行我们之前所加的委托,就是我们点击要执行的函数。
回顾一下之前的代码,我们通过MyEventTrigger.Get (gameObject).onClick 获取到我们要触发点击函数对象上的委托onClick ,然后把MyClick这个函数赋值给这个委托,然后就可以通过我们点击去触发。OnClick的原理就是这样子的,NGUI的其他的比如OnDrag之类的原理都是这样的,有兴趣的话,可以自己研究一下。
这篇博客到这里就结束了,下一篇博客我将讲述一下 NGUI 各种事件触发函数的由来,如我们点击一个精灵,为什么会执行OnClick函数,而不是执行别的函数。