Rileva la direzione del gesto di scorrimento

Questo è il mio codice per provare a simulare un gesto di sfioramento, così quando costruiscoi su mobile so che funzionerà. Nulla viene registrato e sono confuso sul motivo per cui sembra non funzionare. Voglio che venga stampato nella console che ho tolto RTL (da destra a sinistra) o LTR (da sinistra a destra). Non vedo cosa sto sbagliando.

 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 = -1.0f || deltaY <= 1.0f)) { if (startPosition.x < endPosition.x) { print("LTR"); } else { print("RTL"); } } startPosition = endPosition = Vector3.zero; } } 

Posso individuare alcuni problemi nel codice. Non è una buona idea confrontare Vector3 con == o != . Il confronto approssimativo va bene. Stai utilizzando Input.GetMouseButtonDown su una piattaforma mobile.

È necessario utilizzare Input.touches per fare ciò. Passaci sopra, memorizza la posizione iniziale in TouchPhase.Began e poi la posizione finale in TouchPhase.Ended . È quindi ansible utilizzare entrambe le variabili per capire quale direzione il dito è andato.

Il codice sottostante rileva la direzione dello scorrimento anche quando il dito non è stato ancora rilasciato con l’aiuto di TouchPhase.Moved . È ansible disabilitarlo abilitando la variabile booleana detectSwipeOnlyAfterRelease . Puoi anche modificare SWIPE_THRESHOLD per 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"); } } 
 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"); } } } }