两指缩放 两指旋转模型共存 避免冲突和抖动的解决办法
最近在改之前的AR游戏Demo,想努力一下上个架,需要在非AR模式加入两指手势识别,因为本身游戏玩法的输入方式是一指滑动,所以设定两指同时滑动旋转模型,手势识别放大缩小。
看了一下网上普遍比较多的是单指滑动旋转模型,两指缩放。还有人说两指同时判断滑动旋转和缩放会有冲突且有抖动。其实我觉得是很好避免的。但是没有看到相关的内容,自己写了一下就发上来吧。
不是最好的办法,但是的确可以解决问题。
具体思路就是两指操作以两指距离做区分,两指距离比较近的情况视为滑动旋转,两指距离较远视为缩放。(以屏幕最宽边1/3长度为界)
具体代码见下。
if (Input.touchCount > 1)//多指操作
{
Touch t1 = Input.GetTouch(0);
Touch t2 = Input.GetTouch(1);
//单点触控记录初始点
if (t2.phase == TouchPhase.Began)
{
startFingerPos = t2.position;
}
endFingerPos = t2.position;//实时手指位置
DoubleTouchCurrDis = Vector2.Distance(t1.position, t2.position);//实视两指距离
if ((t1.phase == TouchPhase.Moved) && (t2.phase == TouchPhase.Moved)) //双指滑动
{
if(DoubleTouchCurrDis >= Screen.width / 3)//两指间距宽
{
if (OLDDoubleTouchCurrDis == 0)
{
OLDDoubleTouchCurrDis = DoubleTouchCurrDis;
}
else
{
if (OLDDoubleTouchCurrDis - DoubleTouchCurrDis > 0)//放大
{
transform.Translate(Vector3.forward * -0.1f);
OLDDoubleTouchCurrDis = DoubleTouchCurrDis;
return;
}
else if (OLDDoubleTouchCurrDis - DoubleTouchCurrDis < 0)//缩小
{
transform.Translate(Vector3.forward * 0.1f);
OLDDoubleTouchCurrDis = DoubleTouchCurrDis;
return;
}
}
}
else//两指间距窄
{
if ((Mathf.Abs(endFingerPos.x - startFingerPos.x) / Screen.width) >= 0.05f)
{
Debug.Log("向左右滑动");
transform.RotateAround(target.transform.position, Vector3.up, 10 * (endFingerPos.x - startFingerPos.x) / Screen.width);
return;
}
if ((Mathf.Abs(endFingerPos.y - startFingerPos.y) / Screen.height) >= 0.05f)
{
Debug.Log("向上下滑动");
Debug.Log(Screen.orientation);
if (Screen.orientation == ScreenOrientation.LandscapeLeft)
transform.RotateAround(target.transform.position, transform.right, 10 * (endFingerPos.y - startFingerPos.y) / Screen.height);
if (Screen.orientation == ScreenOrientation.LandscapeRight)
transform.RotateAround(target.transform.position, transform.right, -10 * (endFingerPos.y - startFingerPos.y) / Screen.height);
return;
}
}
}
}