在一些游戏中可能需要一些按钮长按的功能,但在EventTrigger找了找貌似没有代表长按的功能。感觉EventTrigger通过Down和Up可以实现,就尝试了下。
长按简单小例子
实现点击和长按并存
先放效果
脚本
using UnityEngine;
using UnityEngine.UI;
public class Day0118 : MonoBehaviour
{
public Slider slider;
private Text sliderText;
[SerializeField]
private bool flayAdd=false;
[SerializeField]
private bool flaySub = false;
[SerializeField]
private float timer=-1;
[Header("点击和长按是分界时间"),SerializeField]
private float interval=0.5f;
// Start is called before the first frame update
void Start()
{
sliderText = slider.transform.Find("Text").GetComponent<Text>();
}
// Update is called once per frame
void Update()
{
if (timer >=0)
timer += Time.deltaTime;
if(timer >= interval)//超过间隔时间也就是长按
{
if (flayAdd)
{
//slider.value += Time.deltaTime;
//长按过程中每一帧+的
slider.value += 1;
}
else if (flaySub)
{
//slider.value -= Time.deltaTime;
slider.value -= 1;
}
}
sliderText.text = (slider.value).ToString();
}
/// <summary>
/// 按下
/// </summary>
/// <param name="what"></param>
public void Point_Down(string what)
{
timer = 0;
if (what == "Add")
flayAdd = true;
else if (what == "Sub")
flaySub = true;
}
/// <summary>
/// 抬起
/// </summary>
/// <param name="what"></param>
public void Point_Up(string what)
{
if(timer<interval)//短语间隔时间视为点击
Point_Click(what);
if (what == "Add")
flayAdd = false;
else if (what == "Sub")
flaySub = false;
timer = -1;
}
/// <summary>
/// 点击
/// </summary>
/// <param name="what"></param>
public void Point_Click(string what)
{
if (what == "Add")
{
slider.value += 1;
}
else if (what == "Sub")
{
slider.value -= 1;
}
}
}
思路
点击Click功能相当于Down+Up组成,也就是抬手之后才完成Onclick这个过程(执行一次),那么长按也就是Down之后就要开始执行功能,Up结束执行。
那么添加一个bool 变量flay,Down把flay=true,Up把flay=flase。然后在Update里 if(flay)就代表着长按的过程时执行的。
这样长按功能就实现了,但还有个问题,想要若点击和长按同时存在(只有长按就不存在这种问题),长按结束最后Up(抬起)了也会多执行点击。
长按=down+…按过程…+up。
点击=down+up。包含的关系。
所以引入一个计时timer=0.,down了之后就开始计时,up清零(up时候判断timer是否达到长按实现,没达到就把此次过程视为点击),Update对timer判断,按的时长超了就执行按的功能。
写完发现bool其实可以不需要,单纯用timer去判断,但每个长按按钮要去对应一个timer。
注意
一些平板和一体机上长按会触发右键,会干扰长按功能,可以讲机子上的长按右键功能关闭。
.
.
哪里写的有问题或有更好的方法欢迎大佬们赐教。