Unity新的UI系统的监听事件的用法有很多种,在UGUI刚出来的时候,网上也搜到过很多种用法,今天我就把这几种方法整理一下,分享给大家。


首先,是第一种方法,也是最直接简单粗暴的方法,但是这种方法只能在UI系统上使用,就是直接在UI组件上绑定事件,这个效率是最高的,但也是最麻烦的。要一个一个的去拖拽脚本到组件上。这个方法不光是Button组件,其他组件也会可以使用,比如InputField等。文章源自大腿Plus-https://www.zhaoshijun.com/archives/772
第二种方法也是比较简单粗暴的,但是相对事件功能上要强大的多,也不依赖组件本身,也可以使用在非UI的GameObject上,这种方法如果用在非UI的物体上,需要在主相机上添加一个PhysicRaycaster组件才能使用。文章源自大腿Plus-https://www.zhaoshijun.com/archives/772

第三种方法就是用代码动态的给组件加监听事件,这种方法其实和第一种原理是一样的。都是利用组件本身的事件接口去实现相应事件的方法,只不过是用代码实现的动态添加的事件监听。文章源自大腿Plus-https://www.zhaoshijun.com/archives/772
下面是放个按钮的添加监听事件的方法,其中一个是带参数的添加方法。文章源自大腿Plus-https://www.zhaoshijun.com/archives/772
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Test : MonoBehaviour { Button btn1; Button btn2; // Use this for initialization void Start() { btn1 = GetComponent<Button>(); btn1.onClick.AddListener(OnClick1); btn2 = GetComponent<Button>(); btn2.onClick.AddListener(delegate () { OnClick2(btn2.gameObject); }); } // Update is called once per frame void Update() { } public void OnClick1() { Debug.Log("Click"); } public void OnClick2(GameObject go) { Debug.Log(go); } } |
第四种方法是和第二种方法的原理是一样的,和第三种方法的实现方式是一样的,在这里也就不多说了,下面直接放上代码。下面代码是用拓展的方式写的,如果单独用可以自行提取相应代码。文章源自大腿Plus-https://www.zhaoshijun.com/archives/772
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
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的物体上。文章源自大腿Plus-https://www.zhaoshijun.com/archives/772
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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); } } } |


评论