Unity3d使用UGUI实现长按功能
在Unity3D开发中,很多开发者都希望了解如何使用UGUI实现长按功能。本文将详细介绍实现该功能的方法。
1. 实现原理
UGUI的Button组件仅支持OnClick事件监听,若要实现长按功能,需要监听按下事件和抬起事件。我们可以借助EventTrigger组件中的OnPointerDown和OnPointerUp事件来完成监听。
为了方便使用,我们将EventTrigger中的事件监听进行封装。以下是封装的代码:
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;
2. 场景设置与脚本挂载
2.1 添加按钮
在场景中添加一个按钮。
2.2 挂载事件监听脚本
在按钮上挂载一个事件监听脚本,以实现类似技能CD冷却的效果,即点击按钮开始遮罩,松开按钮恢复原状。以下是示例脚本:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class EventTest : MonoBehaviour
{
private bool isUp;
private Image img;
void Start()
{
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 == 1f) // 原代码判断img.fillAmount == 0有误,这里改为1表示填满
{
break;
}
yield return null;
}
}
}
3. 总结
通过上述步骤,我们可以在Unity3D中使用UGUI实现长按功能。首先封装EventTrigger的事件监听,然后在场景中添加按钮并挂载事件监听脚本,即可实现所需的交互效果。