问题背景
有一个需求,针对单击和双击需要分别逻辑处理
分析
单击:很容易理解,在Tick里监听按键操作即可
双击:那就做个计数?怎么定义双击?
插入两个概念:
人的反应时间大概在0.2
画面至少15帧,就等于0.1
所以说画面渲染帧间隔超过0.1,人眼能识别卡顿
操作反应大概是0.2-0.4,那我们把两次点击间隔在0.3定义为双击
单击和双击冲突
如果不做处理,那点击一次必然就触发单击,那如何识别点击第一次是属于单击还是接下来的双击呢
答案是延后处理,先存起来再处理。
设计
将操作封装起来,比如定义一个struct InputData , 成员为time,表示点击时间
定义一个List模拟缓存,在Update里先收集每次点击操作,然后模拟定时器的逻辑,如果规定时间内,比如0.3秒内收集到的点击次数只有一个,那就执行单击逻辑,如果多个就执行双击逻辑
编码
using UnityEngine;
using System.Collection.Generic;
namespace View
{
public class UIEvent
{
private List<InputCmd> cmds = new List<Input>(){};
private void Update()
{
if(Input.GetButtonDown(0))
{
cmds.Add(new InputCmd{time = Time.time});
}
if(cmds.Count == 1)
{
if(Time.time - cmds[0] > 0.3)
{
DoSingleClick();
cmds.Clear();
}
}
else if(cmd.Count == 2)
{
DoDoubleClick();
cmds.Clear();
}
}
}
public struct InputCmd
{
public float time;
}
}