c#委托和事件
中有所介绍,在这里是通过 EventSystem 触发绑定在对象上脚本的处理函数,在处理函数中,再触发定义的事件,通过事件调用实际上要执行的逻辑代码。
gist
)
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public class UIEventListener : EventTrigger { public delegate void UIDelegate(GameObject go); public event UIDelegate onPointerEnter; public override void OnPointerEnter(PointerEventData eventData) { if (null != onPointerEnter) { // 传入挂载对象作为参数可以方便在主逻辑脚本中处理 onPointerEnter(gameObject); } } }
|
同样,这个脚本也要挂在对象上,但这里的逻辑只触发了自定义的事件,而事件就可以调用放在任意位置的逻辑代码了。但是手动挂脚本还是不怎么方便日后的修改与维护,所以添加一个静态方法用来获取特定对象的 UIEventListener 组件:
1 2 3 4 5 6 7 8 9 10 11
|
public static UIEventListener GetListener(GameObject go) { UIEventListener listener = go.GetComponent<UIEventListener>();
if (null == listener) {// 如果找不到,那就挂一个 listener = go.AddComponent<UIEventListener>(); }
return listener; }
|
这样这个问题就解决了。
也可以指定单个委托:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
using UnityEngine; using UnityEngine.EventSystems;
public class EventTriggerDelegateExample : MonoBehaviour { void Start() { EventTrigger trigger = GetComponent<EventTrigger>(); EventTrigger.Entry entry = new EventTrigger.Entry(); // 保存有事件类型,和回调函数 entry.eventID = EventTriggerType.PointerDown; entry.callback.AddListener((data) => { OnPointerDownDelegate((PointerEventData)data); }); trigger.triggers.Add(entry); // triggers 是在 EventTrigger 中注册的所有函数 }
// PointerEventData 是 EventSystem 定义的数据类型 public void OnPointerDownDelegate(PointerEventData data) { Debug.Log("OnPointerDownDelegate called."); } }
|
这段代码,获取到了挂载的对象上的 EventTrigger 组件,然后监听对象的某个事件,执行特定的回调方法。
当然也可以类似的将这段代码与自动添加组件一起封装一下再使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
/// <summary> /// 添加EventTrigger的监听事件 /// </summary> /// <param name="obj">添加监听的对象</param> /// <param name="eventID">添加的监听类型</param> /// <param name="action">触发方法</param> private void AddTriggersListener(GameObject obj, EventTriggerType eventID, UnityAction<BaseEventData> action) { EventTrigger trigger = obj.GetComponent<EventTrigger>(); if (trigger == null) { trigger = obj.AddComponent<EventTrigger>(); }
if (trigger.triggers.Count == 0) { trigger.triggers = new List<EventTrigger.Entry>(); } UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action); EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = eventID; entry.callback.AddListener(callback); trigger.triggers.Add(entry); }
|