一、相关知识
查看Button的源代码可以发现,就只有onClick而已,如果想要添加其它事件就必须使用EventSystem.EventTrigger和delegate(代理)
EventTrigger 总共提供了17个事件接口供我们调用
1. OnBeginDrag(PointerEventData eventData);
2. OnCancel(PointerEventData eventData);
3. OnDeselect(PointerEventData eventData);
4. OnDrag(PointerEventData eventData);
5. OnDrop(PointerEventData eventData);
6. OnEndDrag(PointerEventData eventData);
7. OnInitializePotentialDrag(PointerEventData eventData);
8. OnMove(AxisEventData eventData);
9. OnPointerClick(PointerEventData eventData);
10. OnPointerDown(PointerEventData eventData);
11. OnPointerEnter(PointerEventData eventData);
12. OnPointerExit(PointerEventData eventData);
13. OnPointerUp(PointerEventData eventData);
14. OnScroll(PointerEventData eventData);
15. OnSelect(BaseEventData eventData);
16. OnSubmit(BaseEventData eventData);
17. OnUpdateSelected(BaseEventData eventData);
二、代码实战
仅需要配置PerformClick.cs的public对象,就不需要用传统的方法对每个button绑定事件了。
传统的方法如下
EventTriggerListener.cs
using UnityEngine;
using UnityEngine.EventSystems;
public class EventTriggerListener : EventTrigger {
public delegate void VoidDelegate(GameObject obj);
public VoidDelegate onClick;
public VoidDelegate onDown;
public VoidDelegate onUp;
public VoidDelegate onEnter;
public VoidDelegate onExit;
public VoidDelegate onSelect;
public VoidDelegate onUpdateSelect;//关联更新
public static EventTriggerListener Get(GameObject obj)
{
//这样就不需要为每个按钮添加脚本了
EventTriggerListener listener = obj.GetComponent<EventTriggerListener>();
if(listener == null)
{
listener = obj.AddComponent<EventTriggerListener>();
}
return listener;
}
public override void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown(gameObject);
}
public override void OnPointerUp(PointerEventData eventData)
{
if (onUp != null) onUp(gameObject);
}
public override void OnPointerClick(PointerEventData eventData)
{
if(onClick != null) onClick(gameObject);
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (onEnter != null) onEnter(gameObject);
}
public override void OnPointerExit(PointerEventData eventData)
{
if (onExit != null) onExit(gameObject);
}
public override void OnSelect(BaseEventData eventData)
{
if (onSelect != null) onSelect(gameObject);
}
public override void OnUpdateSelected(BaseEventData eventData)
{
if (onUpdateSelect != null) onUpdateSelect(gameObject);
}
}
PerformClick.cs
using UnityEngine;
using UnityEngine.UI;
public class PerformClick : MonoBehaviour {
public Button btn;
// Use this for initialization
void Start () {
EventTriggerListener listener = EventTriggerListener.Get(btn.gameObject);
listener.onClick = OnBtnClick;
listener.onEnter = OnBtnEnter;
}
private void OnBtnEnter(GameObject obj)
{
Debug.Log("enter");
}
private void OnBtnClick(GameObject obj)
{
Debug.Log("click");
}
}