U3D对于按钮的事件监听

来源:互联网 发布:ogame银河帝国源码 编辑:程序博客网 时间:2024/05/19 04:03

步骤:

(一)通过层级面板创建一个新的游戏Canvas,在该Canvas上创建一个Panel用于安放各个组件


(二)在Panel上创建一系列的Button。如图:


修改Button的形状,内容和位置。


(三)创建一个名为TestClick的脚本,并在脚本上定义一个Click方法。

using UnityEngine;  using System.Collections;     public class TestClick : MonoBehaviour {     public void Click()  {  Debug.Log("Button Clicked");  }  }  


(四)选中Button,为其关联上TestClick方法。然后运行,就能看到TestClick的事件了。


以上四个步骤,虽然已经对按钮进行了事件绑定,但是可以发现弊端非常地明显,就是对于一个按钮,需要用一个Monobehavior来进行监听。显然这样做不行,下面我们来学习下利用Delegate和Event来做一个通用类UIEventListener来处理事件。


关于UIEventListener

首先UIEventListener是什么,以及是干嘛用的,首先借用源码里的注释,注释一目了然,不做翻译了。 
UIEventListener源码里的注释 
NGUI中的UIEventListener使用起来很方便,只需要把UIEventListener这个脚本绑定到一个带有Boxcollider的对象上就可以实现点击,可以实现Button,也可以实现Sprite点击。

UIEventListener.cs 对一些常用的事件进行了封装和继承。

一  常用事件:

void OnClick ():点击事件;

void OnDoubleClick ():二次或多次点击事件

void OnHover (bool isOver):手指覆盖事件;

void OnPress (bool isPressed):手指点击事件,包含按下、抬起;isPressed为按下,false为抬起;

void OnSelect (bool selected):是否被选择;

void OnDrag (Vector2 delta):手指滑动事件;

void OnKey (KeyCode key):“键”事件;

二  实质:

这些监听事件都是建立在委托事件上:

publicdelegatevoid BoolDelegate (GameObject Go, bool state);

public BoolDelegate onPress;

三  前提条件:

UIEventListener的GameObejct包含Colllider;

四  怎使用:

1 静态关联方法:

UIEventListener.Get(GameObject).OnPress += pressList;

2 直接重写:

脚本所在的GameObject包含Colllider,直接重写监听事件:

publicclass SceneTwo : MonoBehaviour {

 

void OnPress (bool pressed)

{

Debug.Log("OnPress "+enabled+"   "+NGUITools.GetActive(gameObject)+"   "+pressed);

if (enabled && NGUITools.GetActive(gameObject))

{

}

}

void OnDrag (Vector2 delta)

{

Debug.Log("OnDrag "+enabled+"   "+NGUITools.GetActive(gameObject)+"   "+delta);

if (enabled && NGUITools.GetActive(gameObject))

{

}

}

}



using UnityEngine;  using System.Collections;  using UnityEngine.UI;  using UnityEngine.EventSystems;  public class UIEventListener : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler  {     /// <summary>  /// 定义事件代理  /// </summary>  /// <param name="gb"></param>  public delegate void UIEventProxy(GameObject gb);     /// <summary>  /// 鼠标点击事件  /// </summary>  public event UIEventProxy OnClick;     /// <summary>  /// 鼠标进入事件  /// </summary>  public event UIEventProxy OnMouseEnter;     /// <summary>  /// 鼠标滑出事件  /// </summary>  public event UIEventProxy OnMouseExit;     public void OnPointerClick(PointerEventData eventData)  {  if (OnClick != null)  OnClick(this.gameObject);  }     public void OnPointerEnter(PointerEventData eventData)  {  if (OnMouseEnter != null)  OnMouseEnter(this.gameObject);  }     public void OnPointerExit(PointerEventData eventData)  {  if (OnMouseExit != null)  OnMouseExit(this.gameObject);  }  }  

以下是调用的代码:


using UnityEngine;  using System.Collections;  using UnityEngine.UI;     public class Test : MonoBehaviour  {     // Use this for initialization  void Start()  {  Button btn = this.GetComponent<Button>();  UIEventListener btnListener = btn.gameObject.AddComponent<UIEventListener>();  btnListener.OnClick += delegate(GameObject gb)  {  Debug.Log(gb.name);  };  btnListener.OnMouseEnter += delegate(GameObject gb)  {  Debug.Log(gb.name);  };  btnListener.OnMouseExit += delegate(GameObject gb)  {  Debug.Log(gb.name);  };  }  }  



原创粉丝点击