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

本文介绍了Unity中三种常用的UI事件监听方法:直接监听事件、使用SendMessage及使用UIListener。每种方法都有其特点和适用场景,如直接监听简单但不够灵活;使用SendMessage可指定目标对象和方法;使用UIListener则更为推荐,它通过委托实现灵活的事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.直接监听事件

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

 void OnClick()  

 {  

     Debug.Log("Button is Click!!!"); 

 } 

 

2.使用SendMessage

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

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

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

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

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

 

屏幕快照 2013-06-24 下午5.28.53

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

void Send ()  

{  

    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)  

         { 

            Transform t = transforms[i]; 

            t.gameObject.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver); 

         } 

     }  

     else 

     {  

        target.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver); 

     }  

} 

 3.使用UIListener

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

屏幕快照 2013-06-24 下午5.38.30

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

void Awake ()   

{     

            //获取需要监听的按钮对象 

    GameObject button = GameObject.Find("UI Root (2D)/Camera/Anchor/Panel/LoadUI/MainCommon/Button"); 

             //设置这个按钮的监听,指向本类的ButtonClick方法中。 

     UIEventListener.Get(button).onClick = ButtonClick; 
 }  

     //计算按钮的点击事件 

 void ButtonClick(GameObject button)  

 {  

    Debug.Log("GameObject "+ button.name); 

} 


怎么样是不是很灵活?再看看它的源码,使用的C#的代理,将UI的场景事件通过代理传递出去了。

public class UIEventListener : MonoBehaviour  

{  

     publicdelegatevoidVoidDelegate (GameObject go); 

    publicdelegatevoidBoolDelegate (GameObject go,boolstate); 

     publicdelegatevoidFloatDelegate (GameObject go,floatdelta); 

    publicdelegatevoidVectorDelegate (GameObject go, Vector2 delta); 

   publicdelegatevoidStringDelegate (GameObject go,stringtext); 

     publicdelegatevoidObjectDelegate (GameObject go, GameObject draggedObject); 

     publicdelegatevoidKeyCodeDelegate (GameObject go, KeyCode key); 

  
   publicobjectparameter; 
  
     publicVoidDelegate onSubmit; 

    publicVoidDelegate onClick; 
     publicVoidDelegate onDoubleClick; 

  publicBoolDelegate onHover; 

     publicBoolDelegate onPress; 

     publicBoolDelegate onSelect; 

     publicFloatDelegate onScroll; 

     publicVectorDelegate onDrag; 
     publicObjectDelegate onDrop; 

     publicStringDelegate onInput; 

     publicKeyCodeDelegate onKey; 

    

     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 (Vector2 delta)     {if(onDrag !=null) onDrag(gameObject, delta); } 

     voidOnDrop (GameObject go)     {if(onDrop !=null) onDrop(gameObject, go); } 

     voidOnInput (stringtext)      {if(onInput !=null) onInput(gameObject, text); } 

     voidOnKey (KeyCode key)        {if(onKey !=null) onKey(gameObject, key); } 

    

     /// <summary> 

     /// Get or add an event listener to the specified game object. 

     /// </summary> 
    

     staticpublicUIEventListener Get (GameObject go) 

     {  

         UIEventListener listener = go.GetComponent<UIEventListener>(); 

         if(listener ==null) listener = go.AddComponent<UIEventListener>(); 
         returnlistener; 
     }  

 } 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值