NGUI中按钮连按响应
在NGUI中,按钮连按响应需要提前进行设置。接下来,我们将详细探讨NGUI中按钮连按响应的实现过程。
Unity提供了第三方插件FingerGestures用于处理按钮手势操作。然而,考虑到项目本身使用的是NGUI,该框架已经封装了按钮响应的处理逻辑,虽然没有包含长按处理功能,但引入FingerGestures插件可能会造成资源浪费。因此,我们自行编写了以下代码,现分享给大家,仅供参考。
代码实现
以下代码定义了两个按钮的长按事件,并分别对鼠标和触摸操作进行了处理。主要代码以增加按钮为例进行说明。
// 定义按钮状态枚举
private enum ButtonState
{
OnPress,
OnRelease,
OnLongPress,
NONE
}
// 长按功能开关
private bool canLongPress = false;
// 长按认证时间,当点击按钮超过此时间时,认为是长按
private float duration = 0.5f;
// 长按后,数据改变的时间间隔
private float changeTime = 0.2f;
// 记录开始点击的时间
private float startTime = 0;
// 增加按钮的状态
private ButtonState addBtnState = ButtonState.NONE;
// 减少按钮的状态
private ButtonState reduceState = ButtonState.NONE;
// 辅助函数:判断当前是否悬停在指定按钮上
/// <summary>
/// 判断现在是否经过此物体,辅助获取当前点击物体
/// </summary>
/// <param name="btn">指定的按钮对象</param>
/// <returns>如果悬停在指定按钮上返回true,否则返回false</returns>
bool IsButtonHover(GameObject btn)
{
return UICamera.hoveredObject != null && UICamera.hoveredObject.Equals(btn);
}
// 触摸长按处理函数
/// <summary>
/// 处理触摸事件,包括触摸按下、抬起和长按操作
/// </summary>
void OnTouch()
{
if (Input.touchCount > 0)
{
// 单点触摸
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
// 按下操作
if (IsButtonHover(addBtn))
{
// 点击增加按钮
addBtnState = ButtonState.OnPress;
startTime = Time.time;
}
else if (IsButtonHover(reduceBtn))
{
// 点击减少按钮
reduceState = ButtonState.OnPress;
startTime = Time.time;
}
}
else if (touch.phase == TouchPhase.Canceled || touch.phase == TouchPhase.Ended)
{
// 抬起操作
addBtnState = ButtonState.NONE;
reduceState = ButtonState.NONE;
}
else
{
// 保持按下状态
if (IsButtonHover(addBtn))
{
reduceState = ButtonState.NONE;
if (addBtnState == ButtonState.OnPress)
{
// 检测是否为长按事件
float deltaTime = Time.time - startTime;
if (deltaTime >= duration)
{
// 当按下的时间超过长按确认时间,表示为长按
addBtnState = ButtonState.OnLongPress;
startTime = Time.time;
}
}
else if (addBtnState == ButtonState.OnLongPress)
{
// 长按事件的处理
float deltaTime = Time.time - startTime;
if (deltaTime >= changeTime)
{
// 当按下时间到达处理的时间
int curNum = int.Parse(wnd.GetInputText());
if (curNum < maxNum)
{
preNum = curNum + 1;
wnd.SetInputText(preNum.ToString());
wnd.SetPriceLabelOnDialog(preNum * price);
}
startTime = Time.time;
}
}
}
else if (IsButtonHover(reduceBtn))
{
addBtnState = ButtonState.NONE;
if (reduceState == ButtonState.OnPress)
{
float deltaTime = Time.time - startTime;
if (deltaTime >= duration)
{
reduceState = ButtonState.OnLongPress;
startTime = Time.time;
}
}
else if (reduceState == ButtonState.OnLongPress)
{
float deltaTime = Time.time - startTime;
if (deltaTime >= changeTime)
{
int curNum = int.Parse(wnd.GetInputText());
if (curNum > 0)
{
preNum = curNum - 1;
wnd.SetInputText(preNum.ToString());
wnd.SetPriceLabelOnDialog(preNum * price);
}
startTime = Time.time;
}
}
}
else
{
addBtnState = ButtonState.NONE;
reduceState = ButtonState.NONE;
}
}
}
}
// 鼠标点击长按函数
/// <summary>
/// 处理鼠标事件,包括鼠标按下、抬起和长按操作
/// </summary>
void OnMouse()
{
if (Input.GetMouseButtonDown(0))
{
// 鼠标按下
if (IsButtonHover(addBtn))
{
// 点击增加按钮
addBtnState = ButtonState.OnPress;
startTime = Time.time;
}
else if (IsButtonHover(reduceBtn))
{
// 点击减少按钮
reduceState = ButtonState.OnPress;
startTime = Time.time;
}
}
else if (Input.GetMouseButtonUp(0))
{
// 鼠标抬起
addBtnState = ButtonState.NONE;
reduceState = ButtonState.NONE;
}
else
{
if (IsButtonHover(addBtn))
{
reduceState = ButtonState.NONE;
if (addBtnState == ButtonState.OnPress)
{
float deltaTime = Time.time - startTime;
if (deltaTime >= duration)
{
addBtnState = ButtonState.OnLongPress;
startTime = Time.time;
}
}
else if (addBtnState == ButtonState.OnLongPress)
{
float deltaTime = Time.time - startTime;
if (deltaTime >= changeTime)
{
int curNum = int.Parse(wnd.GetInputText());
if (curNum < maxNum)
{
preNum = curNum + 1;
wnd.SetInputText(preNum.ToString());
wnd.SetPriceLabelOnDialog(preNum * price);
}
startTime = Time.time;
}
}
}
else if (IsButtonHover(reduceBtn))
{
addBtnState = ButtonState.NONE;
if (reduceState == ButtonState.OnPress)
{
float deltaTime = Time.time - startTime;
if (deltaTime >= duration)
{
reduceState = ButtonState.OnLongPress;
startTime = Time.time;
}
}
else if (reduceState == ButtonState.OnLongPress)
{
float deltaTime = Time.time - startTime;
if (deltaTime >= changeTime)
{
int curNum = int.Parse(wnd.GetInputText());
if (curNum > 0)
{
preNum = curNum - 1;
wnd.SetInputText(preNum.ToString());
wnd.SetPriceLabelOnDialog(preNum * price);
}
startTime = Time.time;
}
}
}
else
{
addBtnState = ButtonState.NONE;
reduceState = ButtonState.NONE;
}
}
}
// 每帧更新函数
void Update()
{
// 增加,减少按钮长按监听
if (canLongPress)
{
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
{
OnTouch();
}
else
{
OnMouse();
}
}
}
代码说明
- 按钮状态枚举:
ButtonState枚举定义了按钮的四种状态,分别是按下、释放、长按和无状态。 - 长按参数设置:
duration表示长按认证时间,changeTime表示长按后数据改变的时间间隔。 - 触摸和鼠标事件处理:
OnTouch函数处理触摸事件,OnMouse函数处理鼠标事件。在这两个函数中,根据按钮的状态和按下时间判断是否触发长按事件,并进行相应的处理。 - 更新函数:
Update函数在每一帧中被调用,根据当前平台判断是调用OnTouch函数还是OnMouse函数。
通过以上代码,我们可以在NGUI中实现按钮的连按响应功能。