第一种:用代码动态的给组件加监听事件,都是利用组件本身的事件接口去实现相应事件的方法,只不过是用代码实现的动态添加的事件监听。下面是放个按钮的添加监听事件的方法,其中一个是带参数的添加方法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public static class Develop
{
public static void AddEventTrigger(this GameObject obj, EventTriggerType eventType, UnityAction<BaseEventData> myFunction)
{
EventTrigger eventTrigger = obj.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
eventTrigger = obj.AddComponent<EventTrigger>();
eventTrigger.triggers = new List<EventTrigger.Entry>();
}
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(myFunction);
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = eventType;
entry.callback.AddListener(callback);
eventTrigger.triggers.Add(entry);
}
public static void RemoveEventTrigger(this GameObject obj)
{
EventTrigger eventTrigger = obj.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
return;
}
eventTrigger.triggers.Clear();
}
public static void AddEventTrigger(this Image obj, EventTriggerType eventType, UnityAction<BaseEventData> myFunction)
{
EventTrigger eventTrigger = obj.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
eventTrigger = obj.gameObject.AddComponent<EventTrigger>();
eventTrigger.triggers = new List<EventTrigger.Entry>();
}
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(myFunction);
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = eventType;
entry.callback.AddListener(callback);
eventTrigger.triggers.Add(entry);
}
public static void RemoveEventTrigger(this Image obj)
{
EventTrigger eventTrigger = obj.gameObject.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
return;
}
eventTrigger.triggers.Clear();
}
public static void AddEventTrigger(this RawImage obj, EventTriggerType eventType, UnityAction<BaseEventData> myFunction)
{
EventTrigger eventTrigger = obj.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
eventTrigger = obj.gameObject.AddComponent<EventTrigger>();
eventTrigger.triggers = new List<EventTrigger.Entry>();
}
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(myFunction);
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = eventType;
entry.callback.AddListener(callback);
eventTrigger.triggers.Add(entry);
}
public static void RemoveEventTrigger(this RawImage obj)
{
EventTrigger eventTrigger = obj.gameObject.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
return;
}
eventTrigger.triggers.Clear();
}
}
第二种:是根据NGUI的UIEventListener衍生出来的,事件功能上要强大的多,也不依赖组件本身,也可以使用在非UI的GameObject上,这种方法如果用在非UI的物体上,需要在主相机上添加一个PhysicRaycaster组件才能使用。
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);
}
}
}