正常监听:
GameObject btnObj = GameObject.Find(btnName);
Button btn = btnObj.GetComponent<Button>();
btn.onClick.AddListener(delegate() {
this.OnClick(btnObj);
});
参考雨松的博客改写的UGUI 事件监听:http://www.xuanyusong.com/archives/3325;
可以像NGUI 一样用UIEventListener.get().OnClick = 方法;
下面附上代码
using UnityEngine;
using UnityEngine.EventSystems;
public class UIEventListener : MonoBehaviour, IPointerClickHandler,IPointerUpHandler,IPointerDownHandler,IPointerEnterHandler,IPointerExitHandler,ISelectHandler,IUpdateSelectedHandler
{
public delegate void VoidDelegate(GameObject go);
public delegate void IntDelegate(GameObject go, int index);
public VoidDelegate onClick;
public IntDelegate onIntClick;
public VoidDelegate onDown;
public VoidDelegate onEnter;
public VoidDelegate onExit;
public VoidDelegate onUp;
public VoidDelegate onSelect;
public VoidDelegate onUpdateSelect;
[HideInInspector]
private int index;
static public UIEventListener Get(GameObject go)
{
UIEventListener listener = go.GetComponent<UIEventListener>();
if (listener == null) listener = go.AddComponent<UIEventListener>();
return listener;
}
static public UIEventListener Get(GameObject go, int i)
{
UIEventListener listener = go.GetComponent<UIEventListener>();
if (listener == null) listener = go.AddComponent<UIEventListener>();
listener.index = i;
return listener;
}
public void OnPointerClick(PointerEventData eventData)
{
if (onClick != null) onClick(gameObject);
else if (onIntClick != null) onIntClick(gameObject, index);
}
public void OnPointerUp(PointerEventData eventData)
{
if (onUp != null) onUp(gameObject);
}
public void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown(gameObject);
}
public void OnPointerEnter(PointerEventData eventData)
{
if (onEnter != null) onEnter(gameObject);
}
public void OnPointerExit(PointerEventData eventData)
{
if (onExit != null) onExit(gameObject);
}
public void OnSelect(BaseEventData eventData)
{
if (onSelect != null) onSelect(gameObject);
}
public void OnUpdateSelected(BaseEventData eventData)
{
if (onUpdateSelect != null) onUpdateSelect(gameObject);
}
}
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ButtonTest : MonoBehaviour
{
public GameObject btn_Test;
void Start()
{
UIEventListener.Get(btn_Test).onClick = MyButtonEvent;
}
public void MyButtonEvent(GameObject button)
{
print("Test");
}
}
(二)
using UnityEngine;
using UnityEngine.EventSystems;
public class UIEventListener : EventTrigger
{
public delegate void VoidDelegate(GameObject go);
public delegate void VectorDelegate(GameObject go, Vector2 screenPosition);
public delegate void BoolDelegate(GameObject go, bool value);
public VoidDelegate onClick;
public VoidDelegate onDown;
public VoidDelegate onUp;
public BoolDelegate onHover;
public VectorDelegate onBeginDrag;
public VectorDelegate onDrag;
public VectorDelegate onEndDrag;
static public UIEventListener Get(GameObject go)
{
PhysicsRaycaster raycaster = Camera.main.gameObject.GetComponent<PhysicsRaycaster>();
if (raycaster == null) raycaster = Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
UIEventListener listener = go.GetComponent<UIEventListener>();
if (listener == null) listener = go.AddComponent<UIEventListener>();
return listener;
}
public override void OnPointerClick(PointerEventData eventData)
{
if (onClick != null) onClick.Invoke(gameObject);
}
public override void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown.Invoke(gameObject);
}
public override void OnPointerUp(PointerEventData eventData)
{
if (onUp != null) onUp.Invoke(gameObject);
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (onHover != null) onHover.Invoke(gameObject, true);
}
public override void OnPointerExit(PointerEventData eventData)
{
if (onHover != null) onHover.Invoke(gameObject, false);
}
public override void OnBeginDrag(PointerEventData eventData)
{
Vector2 position;
Canvas canvas = FindObjectOfType<Canvas>();
RectTransform rect = canvas.GetComponent<RectTransform>();
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, eventData.position, canvas.worldCamera, out position))
{
if (onBeginDrag != null) onBeginDrag.Invoke(gameObject, position);
}
}
public override void OnDrag(PointerEventData eventData)
{
Vector2 position;
Canvas canvas = FindObjectOfType<Canvas>();
RectTransform rect = canvas.GetComponent<RectTransform>();
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, eventData.position, canvas.worldCamera, out position))
{
if (onDrag != null) onDrag.Invoke(gameObject, position);
}
}
public override void OnEndDrag(PointerEventData eventData)
{
Vector2 position;
Canvas canvas = FindObjectOfType<Canvas>();
RectTransform rect = canvas.GetComponent<RectTransform>();
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, eventData.position, canvas.worldCamera, out position))
{
if (onEndDrag != null) onEndDrag.Invoke(gameObject, position);
}
}
}
使用方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UiManager : MonoBehaviour
{
public GameObject _btnShow;
void Start()
{
UIEventListener.Get(_btnShow).onHover = isHover;
}
public void isHover(GameObject go, bool isok)
{
Debug.Log("cC");
}
}