Unity AR 一种 两指缩放 两指旋转模型共存 避免冲突和抖动的解决办法

两指缩放 两指旋转模型共存 避免冲突和抖动的解决办法

最近在改之前的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;
                  }
              }
          }
      }

你可能感兴趣的:(Unity)