2017-01-05 4 views
0

Это мой код, чтобы попытаться смоделировать жестом салфетки, поэтому, когда я создаю на мобильный, я знаю, что он будет работать. Ничто не регистрируется, и я смущен тем, почему он, похоже, не работает. Я хочу, чтобы он распечатывался в консоли, чтобы я либо нажал RTL (справа налево), либо LTR (слева направо). Я не вижу, что я делаю неправильно.Обнаружение жестового направления жестов

void Update() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     startPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
    } 
    if (Input.GetMouseButtonUp(0)) 
    { 
     endPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
    } 

    if (startPosition != endPosition && startPosition != Vector3.zero && endPosition != Vector3.zero) 
    { 
     float deltaX = endPosition.x - startPosition.x; 
     float deltaY = endPosition.y - startPosition.y; 
     if ((deltaX > 5.0f || deltaX < -5.0f) && (deltaY >= -1.0f || deltaY <= 1.0f)) 
     { 
      if (startPosition.x < endPosition.x) 
      { 
       print("LTR"); 
      } 
      else 
      { 
       print("RTL"); 
      } 
     } 
     startPosition = endPosition = Vector3.zero; 
    } 
} 
+0

У вас слишком много проверок, особенно последний (endPosition! = Zero) не может быть правдой. Используйте флаги вместо drag = true и drag = false – Everts

ответ

4

я могу заметить некоторые несколько проблем в вашем коде. Не стоит сравнивать Vector3 с == или !=. Приблизительное сравнение в порядке. Вы используете Input.GetMouseButtonDown на мобильной платформе.

Для этого вам необходимо использовать Input.touches. Переверните его, сохраните начальное положение в TouchPhase.Began, а затем конечное положение в TouchPhase.Ended. Затем вы можете использовать обе переменные, чтобы определить, в каком направлении движется палец.

Код ниже определяет направление движения, даже если палец еще не выпущен с помощью TouchPhase.Moved. Вы можете отключить это, включив логическую переменную detectSwipeOnlyAfterRelease. Вы также можете изменить значение SWIPE_THRESHOLD.

public class SwipeDetector : MonoBehaviour 
{ 
    private Vector2 fingerDown; 
    private Vector2 fingerUp; 
    public bool detectSwipeOnlyAfterRelease = false; 

    public float SWIPE_THRESHOLD = 20f; 

    // Update is called once per frame 
    void Update() 
    { 

     foreach (Touch touch in Input.touches) 
     { 
      if (touch.phase == TouchPhase.Began) 
      { 
       fingerUp = touch.position; 
       fingerDown = touch.position; 
      } 

      //Detects Swipe while finger is still moving 
      if (touch.phase == TouchPhase.Moved) 
      { 
       if (!detectSwipeOnlyAfterRelease) 
       { 
        fingerDown = touch.position; 
        checkSwipe(); 
       } 
      } 

      //Detects swipe after finger is released 
      if (touch.phase == TouchPhase.Ended) 
      { 
       fingerDown = touch.position; 
       checkSwipe(); 
      } 
     } 
    } 

    void checkSwipe() 
    { 
     //Check if Vertical swipe 
     if (verticalMove() > SWIPE_THRESHOLD && verticalMove() > horizontalValMove()) 
     { 
      //Debug.Log("Vertical"); 
      if (fingerDown.y - fingerUp.y > 0)//up swipe 
      { 
       OnSwipeUp(); 
      } 
      else if (fingerDown.y - fingerUp.y < 0)//Down swipe 
      { 
       OnSwipeDown(); 
      } 
      fingerUp = fingerDown; 
     } 

     //Check if Horizontal swipe 
     else if (horizontalValMove() > SWIPE_THRESHOLD && horizontalValMove() > verticalMove()) 
     { 
      //Debug.Log("Horizontal"); 
      if (fingerDown.x - fingerUp.x > 0)//Right swipe 
      { 
       OnSwipeRight(); 
      } 
      else if (fingerDown.x - fingerUp.x < 0)//Left swipe 
      { 
       OnSwipeLeft(); 
      } 
      fingerUp = fingerDown; 
     } 

     //No Movement at-all 
     else 
     { 
      //Debug.Log("No Swipe!"); 
     } 
    } 

    float verticalMove() 
    { 
     return Mathf.Abs(fingerDown.y - fingerUp.y); 
    } 

    float horizontalValMove() 
    { 
     return Mathf.Abs(fingerDown.x - fingerUp.x); 
    } 

    //////////////////////////////////CALLBACK FUNCTIONS///////////////////////////// 
    void OnSwipeUp() 
    { 
     Debug.Log("Swipe UP"); 
    } 

    void OnSwipeDown() 
    { 
     Debug.Log("Swipe Down"); 
    } 

    void OnSwipeLeft() 
    { 
     Debug.Log("Swipe Left"); 
    } 

    void OnSwipeRight() 
    { 
     Debug.Log("Swipe Right"); 
    } 
} 
+0

Я знал по мобильному телефону, мне пришлось бы его изменить на Input.touch, я просто пытался имитировать его на своем компьютере, потому что единство не читает Input.touches на компьютере. Только после сборки на мобильном устройстве. Спасибо, хотя и помогли. –

+0

Второе - последнее предложение на самом деле не так. Вы можете протестировать свой телефон, подключенный к компьютеру в редакторе, без его создания. См. [This] (http://stackoverflow.com/q/39107153/3785314) и сохраните свое время. Добро пожаловать! – Programmer

-1
Try this Out. 
I hope this helps. 




void Update(){ 
if (Input.GetMouseButtonDown(0)){ 
    startPosition = Input.mousePosition; 
} 
if (Input.GetMouseButtonUp(0)){ 
    float swipe = startPosition.x - Input.mousePosition.x; 
} 


     if (swipe < 0) 
     { 
      print("LTR"); 
     } else{ 
      print("RTL"); 
     } 
    } 

} 
} 
Смежные вопросы