UGUI按钮的几种响应方式

来源:互联网 发布:cassandra数据库下载 编辑:程序博客网 时间:2024/05/24 04:46

1、  可视化绑定

这种方式就是写好一个带有public方法的脚本,然后在Button的OnClick事件位置添加对应的脚本及事件。这个方式的弊端是容易丢失绑定,适合少量的响应。

2、  脚本监听

脚本代码对按钮进行监听:btn.onclick.AddListener(“监听方法名”);然后实现对应的方法。但是当想要监听方法可以传参是该怎么写呢?

public class ButtonTest : MonoBehaviour {    private Button btn;    void Start () {        btn = transform.GetComponent<Button>();        //以下四种写法其实只是两种写法,就是delegate和lamda表达式        btn.onClick.AddListener(delegate { OnButtonClick(gameObject); });        btn.onClick.AddListener(delegate() { OnButtonClick(gameObject); });        btn.onClick.AddListener(()=>OnButtonClick(gameObject));        btn.onClick.AddListener(() => { OnButtonClick(gameObject); });    }    private void OnButtonClick(GameObject gameObject)    {        print(gameObject.name);    }}

通过delegate或者lamda表达式就可以达成目的。

3、  监听多种事件

有时候我们不止需要点击事件,还需要鼠标进入、悬浮、退出等事件。

这需要用到UGUI的组件EventTrigger,以下是实现点击事件的具体代码。

using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;[RequireComponent(typeof(EventTrigger))] public class EventHandle : MonoBehaviour {    private Button btn;    private EventTrigger trigger;    void Start () {        btn=transform.GetComponent<Button>();        trigger= transform.GetComponent<EventTrigger>();        //触发入口注册        EventTrigger.Entry entry = new EventTrigger.Entry();        //触发类型       entry.eventID = EventTriggerType.PointerClick;        //触发事件注册        entry.callback = new EventTrigger.TriggerEvent();        //监听触发        entry.callback.AddListener(ClickFuc);        //还需要把触发入口entry添加到EventTrigger的触发队列中才能响应        trigger.triggers.Add(entry);         }     private void ClickFuc(BaseEventData arg0)    {        Debug.Log("按钮被点击了");    }}

上面的脚本我们挂载需要监听的button上面就可以了。那么如何绑定别的事件呢?只要把触发类型改变即可,当前是Pointer.Click,可以改成Pointer.Enter/Exit/Up等。然后如果你想要多种事件同时存在,就需要更多的触发入口注册、触发类型,事件注册,监听,这是比较麻烦的地方。

 

4、  实现MonoBehavior接口

MonoBehaviour封装了事件接口,可以实现接口的方式来绑定事件,如下:

using UnityEngine;using UnityEngine.EventSystems; public class ButtonEventHandle : MonoBehaviour,IPointerClickHandler,IPointerEnterHandler{    public void OnPointerClick(PointerEventData eventData)    {        if (eventData.pointerId == -1)            print("鼠标左键点击了");        if (eventData.pointerId == -2)            print("鼠标右键点击了");    }    public void OnPointerEnter(PointerEventData eventData)    {        print("鼠标进入了按钮");    }}


这种方式也很容易实现,但是每个UI元素都需要创建一个MonoBehaviour来监听各个事件,重复代码就显得很笨拙了。

5、  方式4的加强,利用Delegate和Event做一个通用类UIEventListener。通用类的目的就是把接口预先实现好,而具体实现还没确定。

using UnityEngine;using UnityEngine.EventSystems; public class UIEventListener : MonoBehaviour,IPointerClickHandler{    //定义一个事件代理    public  delegate void UIEvent(GameObject go);    //定义点击事件    public event UIEvent OnClick;     public void OnPointerClick(PointerEventData eventData)   {    OnClick(this.gameObject);    }}

然后我们写一个具体测试类来调用通用类,添加相应的事件。

using UnityEngine;using UnityEngine.UI;public class UIEventTest : MonoBehaviour {    private Button btn;    private UIEventListener listener;     // Use this for initialization    void Start () {               btn = transform.GetComponent<Button>();        //添加监听通用类组件        listener =transform.gameObject.AddComponent<UIEventListener>();         //添加对应监听事件        listener.OnClick += Listener_OnClick;         }     private void Listener_OnClick(GameObject go)    {        print("用户点击了"+go.name);    }}

我们可以看到很简单,只要在测试脚本中添加具体的监听事件并实现即可。这种方式主要是通过委托和事件再一次封装,优点就是不用重复继承接口实现接口,重复打代码浪费时间。

0 0
原创粉丝点击