话不多说,前提条件:
1、Physics Raycaster(放在Camera下)
2、EventSystem组件
然后,挂上脚本:
public class PressedManager : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
public Action downAction;
public Action upAction;
public Action pressedAction;
public Action exitAction;
public float delay = 0.2f;
public PressedType type;
public float continuousDelay = 0f;
private bool isPresseding = false;
private bool isDown = false;// 按钮是否是按下状态
private bool isOnce = false;//判断是否第一次触发
private float lastIsDownTime;// 按钮最后一次是被按住状态时候的时间
public enum PressedType {
once,//触发一次
continuous,//连续触发
}
public void OnPointerDown(PointerEventData eventData)
{
downAction?.Invoke();
isDown = true;
lastIsDownTime = Time.time;
}
// 当按钮抬起的时候自动调用此方法
public void OnPointerUp(PointerEventData eventData)
{
upAction?.Invoke();
isDown = false;
isPresseding = false;
isOnce = false;
}
// 当鼠标从按钮上离开的时候自动调用此方法
public void OnPointerExit(PointerEventData eventData)
{
exitAction?.Invoke();
}
void Update()
{
// 如果按钮是被按下状态
if (isDown)
{
// 当前时间 - 按钮最后一次被按下的时间 > 延迟时间0.2秒
if (Time.time - lastIsDownTime > delay)
{
// 触发长按方法
isPresseding = true;
if (type == PressedType.once&&!isOnce)
{
isOnce = true;
pressedAction?.Invoke();
Debug.Log("啊啊啊啊,我一次了。");
}
// 记录按钮最后一次被按下的时间
lastIsDownTime = Time.time;
}
if(Time.time - lastIsDownTime > continuousDelay && isPresseding)
{
if (type == PressedType.continuous)
{
pressedAction?.Invoke();
Debug.Log("啊啊啊啊,我又来了。");
}
// 记录按钮最后一次被按下的时间
lastIsDownTime = Time.time;
}
}
}
}
然后在处理方法的脚本的awake或者start方法内把方法加进委托内:
先声明一个PressedManager :
public PressedManager pressed;
然后按照需要加进不同的委托内
无参数:
pressed.pressedAction += 方法名;
有参数时用lambda表达式:
pressed.pressedAction += ()=>方法;
参数说明:
delay :长按多久触发长按
type: continuous触发长按之后连续触发;once触发长按之后只触发一次
continuousDelay : 连续触发间隔时间