2017-01-05 1 views
0

Das ist mein Code zu versuchen und eine Wischgeste zu simulieren, also wenn ich auf Handy baue, weiß ich, dass es funktionieren wird. Nichts wird protokolliert und ich bin verwirrt darüber, warum es nicht zu funktionieren scheint. Ich möchte, dass es in der Konsole ausgedruckt wird, dass ich entweder RTL (von rechts nach links) oder LTR (von links nach rechts) gewischt habe. Ich sehe nicht, was ich falsch mache. Wischen Gestenrichtung erkennen

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

Sie haben zu viele Überprüfungen, insbesondere die letzte (endPosition! = Null) kann nicht wahr sein. Benutze Flags statt Drag = true und drag = false – Everts

Antwort

4

Ich kann einige wenige Probleme in Ihrem Code erkennen. Es ist keine gute Idee, Vector3 mit == oder != zu vergleichen. Der ungefähre Vergleich ist in Ordnung. Sie verwenden Input.GetMouseButtonDown auf einer mobilen Plattform.

Sie müssen dazu Input.touches verwenden. Schleife darüber, speichern Sie die Anfangsposition in TouchPhase.Began und dann die Endposition in TouchPhase.Ended. Sie können dann beide Variablen verwenden, um herauszufinden, in welche Richtung der Finger ging.

Der folgende Code erkennt die Wischrichtung, auch wenn der Finger noch nicht mit Hilfe von TouchPhase.Moved freigegeben wurde. Sie können dies deaktivieren, indem Sie die boolesche Variable detectSwipeOnlyAfterRelease aktivieren. Sie können auch SWIPE_THRESHOLD für die Empfindlichkeit ändern.

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

Ich wusste auf Handy, ich müsste es zu Input.touches ändern, ich habe nur versucht, es auf meinem Computer zu simulieren, weil Einheit Input.touches auf dem Computer nicht lesen. Funktioniert erst nach dem Build auf dem mobilen Gerät. Vielen Dank, aber viel geholfen. –

+0

Der vorletzte Satz ist nicht wirklich wahr. Sie können mit Ihrem Smartphone, das mit Ihrem Computer verbunden ist, im Editor testen, ohne es zu erstellen. Bitte sehen Sie [diese] (http://stackoverflow.com/q/39107153/3785314) und speichern Sie Ihre eigene Zeit. Bitte schön! – 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"); 
     } 
    } 

} 
}