Is there any way to restrict touch inputs to a panel in Unity3D?

Viewed 317

I'm trying to implement swipe controls in my game and want the swipes to be detected only on the left side of the screen and leave the other control mechanism of the game as is.

I'm using this SwipeManager:

public enum Swipes { None, Up, Down, Left, TopLeft, BottomLeft, Right, TopRight,  BottomRight};

public class SwipeManager : MonoBehaviour
{
    public float minSwipeLength = 200f;

    private Vector2 fingerStart;
    private Vector2 fingerEnd;

    public static Swipes direction;
    public static float angle;
    public static Vector2 strength;

    public static bool debugMode = false;

    void Update ()
    {
        SwipeDetection();
    }

    public void SwipeDetection ()
    {
        if (Input.GetMouseButtonDown(0)) {
            fingerStart = Input.mousePosition;
            fingerEnd  = Input.mousePosition;
        }

        if(Input.GetMouseButton(0)) {
            fingerEnd = Input.mousePosition;

            strength = new Vector2 (fingerEnd.x - fingerStart.x, fingerEnd.y - fingerStart.y);

            // Make sure it was a legit swipe, not a tap
            if (strength.magnitude < minSwipeLength) {
                direction = Swipes.None;
                return;
            }

            angle = (Mathf.Atan2(strength.y, strength.x) / (Mathf.PI));
            if (debugMode) Debug.Log(angle);
            // Swipe up
            if (angle>0.375f && angle<0.625f) {
                direction = Swipes.Up;
                if (debugMode) Debug.Log ("Up");
                // Swipe down
            } else if (angle<-0.375f && angle>-0.625f) {
                direction = Swipes.Down;
                if (debugMode) Debug.Log ("Down");
                // Swipe left
            } else if (angle<-0.875f || angle>0.875f) {
                direction = Swipes.Left;
                if (debugMode) Debug.Log ("Left");
                // Swipe right
            } else if (angle>-0.125f && angle<0.125f) {
                direction = Swipes.Right;
                if (debugMode) Debug.Log ("Right");
            }
            else if(angle>0.125f && angle<0.375f){
                direction = Swipes.TopRight;
                if (debugMode) Debug.Log ("top right");
            }
            else if(angle>0.625f && angle<0.875f){
                direction = Swipes.TopLeft;
                if (debugMode) Debug.Log ("top left");
            }
            else if(angle<-0.125f && angle>-0.375f){
                direction = Swipes.BottomRight;
                if (debugMode) Debug.Log ("bottom right");
            }
            else if(angle<-0.625f && angle>-0.875f){
                direction = Swipes.BottomLeft;
                if (debugMode) Debug.Log ("bottom left");
            }
        }

        if(Input.GetMouseButtonUp(0)) {
            direction = Swipes.None;  
        }
    }
}

I want to create a panel on the left of the screen and want the swipes to be detected only on the panel, anywhere clicked outside that panel (i.e. on the right side of the screen) should not be considered a swipe but to target (as it is set up now)

Thanks

1 Answers

One solution is to skip SwipeDetection when the mouse pointer is outside of the panel. So, if you can get a reference to the panel's RectTransform, then you can just check if the mouse pointer is inside of it before you call SwipeDetection.

In order to account for the possibility of the user pressing out of the panel then moving into it, you could assign fingerStart = Input.mousePosition; when the mouse is outside of the rect.

Altogether, this might look like:

public RectTransform rectTransform; // panel RectTransform assigned to this variable

...

void Update ()
{
    Vector2 mousePosition = Input.mousePosition;

    if (RectTransformUtility.RectangleContainsScreenPoint(rectTransform, mousePosition))
    {
        SwipeDetection();
    }
    else 
    {
        fingerStart = Input.mousePosition;
        direction = Swipes.None;
    }
}
Related