NGUI研究院之三种方式监听NGUI的事件方法

原文地址:http://www.xuanyusong.com/archives/2390


NGUI事件的种类很多,比如点击、双击、拖动、滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例。

1.直接监听事件

把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不灵活

voidOnClick()
{
Debug.Log("Button is Click!!!");
}

2.使用SendMessage

选择按钮后,在Unity导航菜单栏中选择Component->Interaction->Button Message 组件。

Target:接收按钮消息的游戏对象。

Function Name:接收按钮消息的方法,拥有这个方法的脚本必须绑定在上面Target对象身上。

Trigger:触发的事件,OnClick显然是一次点击。

Include Children :是否让该对象的所有子对象也发送这个点击事件。

 

NGUI研究院之三种方式监听NGUI的事件方法(七) - 雨松MOMO程序研究院 - 1

到UIButtonMessage.cs这个脚本中看看,其实很简单就是调用Unity自身的SendMessage而已。

voidSend()
{
if(string.IsNullOrEmpty(functionName))return;
if(target==null)target=gameObject;
 
if(includeChildren)
{
Transform[]transforms=target.GetComponentsInChildren<Transform>();
 
for(inti=0,imax=transforms.Length;i<imax;++i)
{
Transformt=transforms[i];
t.gameObject.SendMessage(functionName,gameObject,SendMessageOptions.DontRequireReceiver);
}
}
else
{
target.SendMessage(functionName,gameObject,SendMessageOptions.DontRequireReceiver);
}
}

3.使用UIListener

这个也是推荐大家使用的一种方法,选择按钮后在Unity导航菜单栏中选择Component->NGUI->Internal ->Event Listener 。 挂在按钮上就可以,它没有任何参数。。

NGUI研究院之三种方式监听NGUI的事件方法(七) - 雨松MOMO程序研究院 - 2

在任何一个脚本或者类中即可得到按钮的点击事件、把如下代码放在任意类中或者脚本中。

voidAwake()
{
                //获取需要监听的按钮对象
GameObjectbutton=GameObject.Find("UI Root (2D)/Camera/Anchor/Panel/LoadUI/MainCommon/Button");
                //设置这个按钮的监听,指向本类的ButtonClick方法中。
UIEventListener.Get(button).onClick=ButtonClick;
}
 
        //计算按钮的点击事件
voidButtonClick(GameObjectbutton)
{
Debug.Log("GameObject "+button.name);
 
}
怎么样是不是很灵活?再看看它的源码,使用的C#的代理,将UI的场景事件通过代理传递出去了。

publicclassUIEventListener:MonoBehaviour
{
publicdelegatevoidVoidDelegate(GameObjectgo);
publicdelegatevoidBoolDelegate(GameObjectgo,boolstate);
publicdelegatevoidFloatDelegate(GameObjectgo,floatdelta);
publicdelegatevoidVectorDelegate(GameObjectgo,Vector2delta);
publicdelegatevoidStringDelegate(GameObjectgo,stringtext);
publicdelegatevoidObjectDelegate(GameObjectgo,GameObjectdraggedObject);
publicdelegatevoidKeyCodeDelegate(GameObjectgo,KeyCodekey);
 
publicobjectparameter;
 
publicVoidDelegateonSubmit;
publicVoidDelegateonClick;
publicVoidDelegateonDoubleClick;
publicBoolDelegateonHover;
publicBoolDelegateonPress;
publicBoolDelegateonSelect;
publicFloatDelegateonScroll;
publicVectorDelegateonDrag;
publicObjectDelegateonDrop;
publicStringDelegateonInput;
publicKeyCodeDelegateonKey;
 
voidOnSubmit(){if(onSubmit!=null)onSubmit(gameObject);}
voidOnClick(){if(onClick!=null)onClick(gameObject);}
voidOnDoubleClick(){if(onDoubleClick!=null)onDoubleClick(gameObject);}
voidOnHover(boolisOver){if(onHover!=null)onHover(gameObject,isOver);}
voidOnPress(boolisPressed){if(onPress!=null)onPress(gameObject,isPressed);}
voidOnSelect(boolselected){if(onSelect!=null)onSelect(gameObject,selected);}
voidOnScroll(floatdelta){if(onScroll!=null)onScroll(gameObject,delta);}
voidOnDrag(Vector2delta){if(onDrag!=null)onDrag(gameObject,delta);}
voidOnDrop(GameObjectgo){if(onDrop!=null)onDrop(gameObject,go);}
voidOnInput(stringtext){if(onInput!=null)onInput(gameObject,text);}
voidOnKey(KeyCodekey){if(onKey!=null)onKey(gameObject,key);}
 
/// <summary>
/// Get or add an event listener to the specified game object.
/// </summary>
 
staticpublicUIEventListenerGet(GameObjectgo)
{
UIEventListenerlistener=go.GetComponent<UIEventListener>();
if(listener==null)listener=go.AddComponent<UIEventListener>();
returnlistener;
}
}

 

但是有时候我们项目中需要监听UI的东西可能不止这些,我们也可以拓展一下C#的事件方法。或者也可以使用 Unity3D研究院之通过C#使用Advanced CSharp Messenger(五十)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值