2017-01-05 1 views
0

C'est mon code pour essayer de simuler un mouvement de balayage, donc quand je construis sur un mobile, je sais que ça marchera. Rien n'est consigné et je suis confus sur pourquoi il semble ne pas fonctionner. Je veux qu'il imprime dans la console que j'ai glissé RTL (de droite à gauche) ou LTR (de gauche à droite). Je ne vois pas ce que je fais de mal.Détecter la direction du geste de balayage

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

Vous avez trop de contrôles, en particulier le dernier (endPosition! = Zéro) ne peut pas être vrai. Utilisez les drapeaux à la place drag = true et drag = false – Everts

Répondre

4

je peux repérer quelques quelques problèmes dans votre code. Ce n'est pas une bonne idée de comparer Vector3 avec == ou !=. La comparaison approximative est bonne. Vous utilisez Input.GetMouseButtonDown sur une plate-forme mobile. Pour cela, vous devez utiliser Input.touches pour cela. Boucle sur elle, stocker la position de départ dans TouchPhase.Began, puis la position de fin dans TouchPhase.Ended. Vous pouvez ensuite utiliser les deux variables pour déterminer dans quelle direction le doigt est allé.

Le code ci-dessous détecte la direction de balayage même lorsque le doigt n'est pas encore libéré à l'aide de TouchPhase.Moved. Vous pouvez désactiver cela en activant la variable booléenne detectSwipeOnlyAfterRelease. Vous pouvez également modifier SWIPE_THRESHOLD pour la sensibilité.

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

Je savais sur mobile que je devais le changer en Input.touches, j'essayais juste de le simuler sur mon ordinateur car l'unité ne lit pas Input.touches sur l'ordinateur. Seulement après la construction est sur l'appareil mobile. Merci bien aidé beaucoup. –

+0

L'avant-dernière phrase n'est pas vraiment vraie. Vous pouvez tester avec votre téléphone connecté à votre ordinateur dans l'éditeur sans le construire. S'il vous plaît voir [this] (http://stackoverflow.com/q/39107153/3785314) et économisez votre temps libre. Je vous en prie! – 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"); 
     } 
    } 

} 
}