- Home /
 
Swipe and Hold to move character .
Hi all ,
I am trying to move my character by following gesture : User swipes on screen ( this swipe determines which direction character is suppose to move ) and then without lifting the finger holds it down on the screen . When user holds it down i want it to keep looping (calling the move command with specific direction ) until user takes his finger off the screen . I tried using touchphase.Stationary instead of touchphase.ended which i am using in my current script , the results were wonky and weird and not perfect and i am clueless as to where to start. I hope somebody from here will b able to help me out . 
 using UnityEngine;
 using System.Collections;
 
 public class SwipeDetector : MonoBehaviour 
 {
     private float fingerStartTime  = 0.0f;
     private Vector2 fingerStartPos = Vector2.zero;
 
     private bool isSwipe = false;
     private float minSwipeDist  = 30.0f;
     private float maxSwipeTime = 0.5f;
 
     public GameObject player;
     public PlayerMovement playerMovementScript;
     void Start(){
 
         
 
     }
 
     void Update()
     {
 
 #if UNITY_EDITOR 
 
         if (Input.GetKeyDown (KeyCode.A)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.left = true;
             }
             
 
         }else if (Input.GetKeyDown (KeyCode.S)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.down = true;
             }
         
 
         }else if (Input.GetKeyDown (KeyCode.D)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.right = true;
             }
             
 
         }else if (Input.GetKeyDown (KeyCode.W)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.top = true;
             }
             
 
         }
 
 #else
 
         if (Input.touchCount > 0 && Time.timeScale > 0.0f) 
         {
 
             foreach (Touch touch in Input.touches) 
             {
 
                 switch (touch.phase) 
                 {
 
                 case TouchPhase.Began:
                     /* this is a new touch */
                     isSwipe = true;
                     fingerStartTime = Time.time;
                     fingerStartPos = touch.position;
                     break;
 
                 case TouchPhase.Canceled:
                     /* The touch is being canceled */
                     isSwipe = false;
                     break;
 
                 case TouchPhase.Ende:
 
                     float gestureTime = Time.time - fingerStartTime;
                     float gestureDist = (touch.position - fingerStartPos).magnitude;
 
                     if (isSwipe && gestureTime < maxSwipeTime && gestureDist > minSwipeDist) {
 
                         Vector2 direction = touch.position - fingerStartPos;
                         //Vector2 swipeType = Vector2.zero;
                         int swipeType = -1;
     //                        if (Mathf.Abs(direction.normalized.x) > 0.9)
     //                        {
     //
     //                            if (Mathf.Sign(direction.x) > 0) swipeType = 0; // swipe right
     //                            else swipeType = 1; // swipe left
     //
     //                        }
     //                        else if (Mathf.Abs(direction.normalized.y) > 0.9)
     //                        {
     //                            if (Mathf.Sign(direction.y) > 0) swipeType = 2; // swipe up
     //                            else swipeType = 3; // swipe down
     //                        }
     //                        else
     //                        {
                         // diagonal:
                         if (Mathf.Sign (direction.x) > 0) {
 
                             if (Mathf.Sign (direction.y) > 0)
                                 swipeType = 4; // swipe diagonal up-right
                             else
                                 swipeType = 5; // swipe diagonal down-right
 
                         } else {
 
                             if (Mathf.Sign (direction.y) > 0)
                                 swipeType = 6; // swipe diagonal up-left
                             else
                                 swipeType = 7; // swipe diagonal down-left
 
                         }
 
                         //                        }
 
                         switch (swipeType) {
 
                         case 0: //right
     //                            swipeDirection.GetComponent<Text>().text = "right";
                             break;
 
 
                         case 1: //left
     //                            swipeDirection.GetComponent<Text>().text = "left";
                             break;
 
                         case 2: //up
     //                            swipeDirection.GetComponent<Text>().text = "up";
                             break;
 
                         case 3: //down
     //                            swipeDirection.GetComponent<Text> ().text = "down";
                             break;
 
                         case 4: //up right
 //                            swipeDirection.GetComponent<Text> ().text = "upright";
                             playerMovementScript.right = true;
                             break;
                         case 5: //down right
 //                            swipeDirection.GetComponent<Text>().text = "downright";
                             playerMovementScript.down = true;
                             break;
 
                         case 6: //up left
 //                            swipeDirection.GetComponent<Text>().text = "upleft";
                             playerMovementScript.top = true;
                             break;
 
                         case 7: //down left
 //                            swipeDirection.GetComponent<Text>().text = "downleft";
                             playerMovementScript.left = true;
                             break;
 
                         }
 
                     }
 
                     break;
 
                 }
 
             }
 
         }
         #endif
     }
 
 }
 
              Answer by abhijeet1001 · Dec 13, 2016 at 10:41 PM
Sometimes all you need is some alone time and brain power to find the solution which in my case was pretty easy . Here is the final script :
 using UnityEngine;
 using System.Collections;
 
 public class SwipeDetector : MonoBehaviour 
 {
     private float fingerStartTime  = 0.0f;
     private Vector2 fingerStartPos = Vector2.zero;
 
     private bool isSwipe = false;
     private float minSwipeDist  = 30.0f;
     private float maxSwipeTime = 10f;
 
     public GameObject player;
     public PlayerMovement playerMovementScript;
 
     bool canInvoke = true;
 
 
     void Start(){
 
 
     }
 
     void Update()
     {
 
 #if UNITY_EDITOR 
 
         if (Input.GetKeyDown (KeyCode.A)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.left = true;
             }
             
         }else if (Input.GetKeyDown (KeyCode.S)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.down = true;
             }
             
         }else if (Input.GetKeyDown (KeyCode.D)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.right = true;
             }
             
         }else if (Input.GetKeyDown (KeyCode.W)) {
             if(playerMovementScript.enabled == true){
                 playerMovementScript.top = true;
             }
             
         }
 
 #else
 
         if (Input.touchCount > 0 && Time.timeScale > 0.0f) 
         {
 
             foreach (Touch touch in Input.touches) 
             {
                 if (touch.phase == TouchPhase.Began){
                     isSwipe = true;
                     fingerStartTime = Time.time;
                     fingerStartPos = touch.position;
                 }
 
                 if (touch.phase != TouchPhase.Ended && touch.phase != TouchPhase.Canceled) {
 
 
                     float gestureTime = Time.time - fingerStartTime;
                     float gestureDist = (touch.position - fingerStartPos).magnitude;
 
                     if (canInvoke && isSwipe && gestureTime < maxSwipeTime && gestureDist > minSwipeDist) {
 
                         canInvoke = false;
                         Invoke ("invokeMovement", .4f);
 
                         Vector2 direction = touch.position - fingerStartPos;
                         //Vector2 swipeType = Vector2.zero;
                         int swipeType = -1;
                         //                        if (Mathf.Abs(direction.normalized.x) > 0.9)
                         //                        {
                         //
                         //                            if (Mathf.Sign(direction.x) > 0) swipeType = 0; // swipe right
                         //                            else swipeType = 1; // swipe left
                         //
                         //                        }
                         //                        else if (Mathf.Abs(direction.normalized.y) > 0.9)
                         //                        {
                         //                            if (Mathf.Sign(direction.y) > 0) swipeType = 2; // swipe up
                         //                            else swipeType = 3; // swipe down
                         //                        }
                         //                        else
                         //                        {
                         // diagonal:
                         if (Mathf.Sign (direction.x) > 0) {
 
                             if (Mathf.Sign (direction.y) > 0)
                                 swipeType = 4; // swipe diagonal up-right
                     else
                                 swipeType = 5; // swipe diagonal down-right
 
                         } else {
 
                             if (Mathf.Sign (direction.y) > 0)
                                 swipeType = 6; // swipe diagonal up-left
                     else
                                 swipeType = 7; // swipe diagonal down-left
 
                         }
 
                         //                        }
 
                         switch (swipeType) {
 
                         case 0: //right
 //                            swipeDirection.GetComponent<Text>().text = "right";
                             break;
 
 
                         case 1: //left
 //                            swipeDirection.GetComponent<Text>().text = "left";
                             break;
 
                         case 2: //up
 //                            swipeDirection.GetComponent<Text>().text = "up";
                             break;
 
                         case 3: //down
 //                            swipeDirection.GetComponent<Text> ().text = "down";
                             break;
 
                         case 4: //up right
 //                            swipeDirection.GetComponent<Text> ().text = "upright";
                             playerMovementScript.right = true;
                             break;
                         case 5: //down right
 //                            swipeDirection.GetComponent<Text>().text = "downright";
                             playerMovementScript.down = true;
                             break;
 
                         case 6: //up left
 //                            swipeDirection.GetComponent<Text>().text = "upleft";
                             playerMovementScript.top = true;
                             break;
 
                         case 7: //down left
 //                            swipeDirection.GetComponent<Text>().text = "downleft";
                             playerMovementScript.left = true;
                             break;
 
                         }
 
                     }
 
                 } else if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled) {
                     canInvoke = true;
                 }
                 
             }
 
         }
         #endif
     }
 
     public void invokeMovement(){
 
         canInvoke = true;
 
     }
 }
 
              Your answer
 
             Follow this Question
Related Questions
Input.GetTouch(0).position.x and TouchPhase.Began 1 Answer
Swipe on the part of the screen 1 Answer
How to convert Touch Input To Mouse Input C# unity? 1 Answer
codes for detecting mobile double tap and hold 1 Answer
C# Screen.width Touch Input In Multiple Scripts Affect Each Other - Please Help 1 Answer