Unity3d使用UGUI实现长按功能
UGUI的Button组件只有OnClick事件的监听,要实现长按功能,要监听按下事件和抬起事件,所以要使用到EventTrigger组件中的OnPointerDown和OnPointerUp来监听。
为了方便,把EventTrigger中的事件监听都封装起来,我是使用了雨松MOMO写的EventTriggerListener,用起来很方便,地址:http://www.xuanyusong.com/archives/3325
代码:
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go); public delegate void BoolDelegate(GameObject go, bool state); public delegate void FloatDelegate(GameObject go, float delta); public delegate void VectorDelegate(GameObject go, Vector2 delta); public delegate void ObjectDelegate(GameObject go, GameObject obj); public delegate void KeyCodeDelegate(GameObject go, KeyCode key); public VoidDelegate onClick; public VoidDelegate onDown; public VoidDelegate onEnter; public VoidDelegate onExit; public VoidDelegate onUp; public VoidDelegate onSelect; public VoidDelegate onUpdateSelect; static public EventTriggerListener Get(GameObject go) { EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; } static public EventTriggerListener Get(Transform transform) { EventTriggerListener listener = transform.GetComponent<EventTriggerListener>(); if (listener == null) listener = transform.gameObject.AddComponent<EventTriggerListener>(); return listener; } public override void OnPointerClick(PointerEventData eventData) { if (onClick != null) onClick(gameObject); } public override void OnPointerDown(PointerEventData eventData) { if (onDown != null) onDown(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 OnPointerUp(PointerEventData eventData) { if (onUp != null) onUp(gameObject); } public override void OnSelect(BaseEventData eventData) { if (onSelect != null) onSelect(gameObject); } public override void OnUpdateSelected(BaseEventData eventData) { if (onUpdateSelect != null) onUpdateSelect(gameObject); } }
使用EventTriggerListener的Get方法就可以了,和NGUI的UIEventListener一样。
例如:
EventTriggerListener.Get(gameObject).onDown += OnClickDown;
EventTriggerListener.Get(gameObject).onUp += OnClickUp;
然后在场景中添加一个按钮
然后再按钮上挂一个事件监听的脚本,譬如我要做一个类似技能CD冷却的效果,点击开始遮罩,松开恢复原状。
脚本如下:
using UnityEngine; using System.Collections; using UnityEngine.UI; public class EventTest : MonoBehaviour { private bool isUp; private Image img; void Start () { /*EventTriggerListener.Get(gameObject).onDown += (go) => { Debug.Log("按下!"); }; EventTriggerListener.Get(gameObject).onUp += (go) => { Debug.Log("抬起!"); }; EventTriggerListener.Get(gameObject).onSelect += (go) => { Debug.Log("选中!"); }; EventTriggerListener.Get(gameObject).onEnter += (go) => { Debug.Log("进入!"); }; EventTriggerListener.Get(gameObject).onExit += (go) => { Debug.Log("退出!"); }; * */ img = transform.Find("Image").GetComponent<Image>(); EventTriggerListener.Get(gameObject).onDown += OnClickDown; EventTriggerListener.Get(gameObject).onUp += OnClickUp; } void OnClickDown(GameObject go) { isUp = false; StartCoroutine(grow()); } void OnClickUp(GameObject go) { isUp = true; img.fillAmount = 0f; } private IEnumerator grow() { while (true) { if (isUp) { break; } img.fillAmount += 0.5f * Time.deltaTime; if (img.fillAmount == 0) { break; } yield return null; } } }
长按效果: