本人是自学的,可能逻辑不够清晰,如有误,欢迎交流。
需求
需要区分左右手操作,有2种手势,假设红色为左手(单击),蓝色为右手(双击),并且一直跟踪区别左右手。然后其他根据左右手的具体操作,可在别的脚本通过调用该getTouch()即可。具体看下动图。
效果图
知识点
1、Input.getTouch(int index):按索引值获取一个Touch对象。
2、Touch.fingerId:特定的触摸,会持续下去,它是一个唯一的标识符,可用此跟踪任何触摸操作。当触摸从阵列中消失时,触摸将结束,此ID将用于另一次触摸。
3、解释2、
①将手指按食指、中指、无名指、小指的顺序触摸屏幕 :
食指触摸后,fingerID=0;
中指触摸后,fingerID=1;
无名触摸后,fingerID=2;
小指触摸后,fingerID=3;
②之后中指离开屏幕:
食指还是fingerID=0;
无名指还是fingerID=2;
小指还是fingerID=3;
③这时又有一个手指触摸屏幕上:(不一定是中指)
食指还是fingerID=0
无名指还是fingerID=2;
小指还是fingerID=3;
新手指触摸后,fingerID=1;
新手指加入时,看到fingerID=1是空,就直接占用fingerID。后面再加新手指,就fingerID=4。
4.之前没搞清楚fingerID和getTouch()的参数间的关系,时不时出现bug,然后做了一些测试,如下图。
黑色字是我触碰操作,蓝色字是测试得的。
代码
public GameObject mouse_L, mouse_R;
public int z = 9; //鼠标离摄像机的z轴距离
public Touch touch_L, touch_R;
void Start()
{
//初始化左右touch为结束阶段(没触碰点)
touch_L = new Touch();
touch_L.phase = TouchPhase.Canceled;
touch_R = new Touch();
touch_R.phase = TouchPhase.Canceled;
}
void FixedUpdate()
{
//没有触碰点
if (Input.touchCount == 0)
{
touch_L.phase = TouchPhase.Canceled;
touch_R.phase = TouchPhase.Canceled;
touch_L.fingerId = 0;
touch_R.fingerId = 0;
}
//只有1触碰点
else if (Input.touchCount == 1)
{
//刚触碰
if (!IsTouch(touch_L) && !IsTouch(touch_R))
{
Debug.Log("ceshi:" + Input.GetTouch(0).tapCount);
//多击/双击:右手
if (Input.GetTouch(0).tapCount > 1)
{
CreatTouch(0, "R"); //获取第1个触摸点默认右手(fingerID=0)
touch_L.fingerId = 1; //则第2个触摸点默认为左手(fingerID=1)
//Debug.Log("ceshi1:L ID:" + touch_L.fingerId + ",R ID:" + touch_R.fingerId + " ,touchCount" + Input.touchCount);
}
//单击:左手
else
{
CreatTouch(0, "L"); //获取第1个触摸点默认左手(fingerID=0)
touch_R.fingerId = 1; //则第2个触摸点默认为右手(fingerID=1
}
}
else
{
if (Input.GetTouch(0).fingerId == touch_L.fingerId)
{
CreatTouch(0, "L");
}
else if (Input.GetTouch(0).fingerId == touch_R.fingerId)
{
CreatTouch(0, "R");
}
else
{
Debug.Log("ceshi4:0 ID:" + Input.GetTouch(0).fingerId + ",phase:" +Input.GetTouch(0).phase);
Debug.Log("ceshi4:L ID:" + touch_L.fingerId + ",phase:" + touch_L.phase + ",R ID:" + touch_R.fingerId + ",phase:" + touch_R.phase + " ,touchCount" + Input.touchCount);
}
}
}
//2触碰点
else if (Input.touchCount == 2)
{
CreatTouch(touch_L.fingerId, "L");
CreatTouch(touch_R.fingerId, "R");
}
}
bool IsTouch(Touch touch)
{
//当属于取消或结束,则没有触碰点
if (touch.phase == TouchPhase.Canceled || touch.phase == TouchPhase.Ended)
return false;
return true;
}
//创建左/右手鼠标
void CreatTouch(int i, string LorR)
{
if (LorR.Equals("L"))
{
touch_L = Input.GetTouch(i); //获取第一个触摸点(默认左手)
Vector3 touchPos_L = touch_L.position; //获取左手坐标
Vector3 pos_L = Camera.main.ScreenToWorldPoint(touchPos_L + new Vector3(0, 0, z)); //左触摸点的位置(相机屏幕坐标2d->3d + z轴偏移量)
mouse_L.transform.position = pos_L; //左手触摸点的拖尾效果
}
else if (LorR.Equals("R"))
{
touch_R = Input.GetTouch(i); //获取第二个触摸点(默认右手)
Vector3 touchPos_R = touch_R.position; //获取右手坐标
Vector3 pos_R = Camera.main.ScreenToWorldPoint(touchPos_R + new Vector3(0, 0, z));//右触摸点的位置(相机屏幕坐标2d->3d + z轴偏移量)
mouse_R.transform.position = pos_R; //右手触摸点的拖尾效果
}
}