Search code examples
androidmobileunity-game-enginetouchmulti-touch

Unity3D touch event binding


I have created a button in my 2d game using Unity3d, added box collider 2d with name PADBASE to detect touch events this way:

if(Input.touchCount > 0)
{
    for(int i = 0; i < Input.touchCount; i++)
    {
        Vector3 mouseWorldPos3D = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
        Vector2 mousePos2D = new Vector2(mouseWorldPos3D.x, mouseWorldPos3D.y);
        Vector2 dir = Vector2.zero;
        RaycastHit2D hit = Physics2D.Raycast(mousePos2D, dir);
        Touch t = Input.GetTouch(i);

        if (hit.transform != null)
        {
            if(Physics2D.Raycast (hit.transform.position , hit.transform.forward))
            {
                GameObject recipient = hit.transform.gameObject;

                if(t.phase == TouchPhase.Began) //poczatek dotyku
                {
                    // button clicked

                    // change colour to red to visually show that button is being pressed
                }
                else if (t.phase == TouchPhase.Ended)
                {
                    // change collor to its default colour to visually show that its no longer pressed
                }
            }

        }
    }
}

And lets assume I will change button colour to red when player touched the button, and back to its default colour when he released his finger (for example)

Now it will obviously work only when player will release his finger, as long as his finger is actually inside bounds of the box collider, what I am trying to do is "bind touch events(?)" to still catch touch event (slide or ended) even if player moved his finger outside of the collider without releasing his finger (for example accidentally)

I am looking forward for some suggestions, thanks.

In my game I will have multiple buttons so multi touch is necessary.


Solution

  • Solved, it actually turns to be really easy, you need to store and compare touch finger ID.

    Solution:

    - on touch began:

    check if touch is withing game objects box collider like in the code attached above.

    get touch finger ID and pass it to your button or keep reference of it

    - on touch ended:

    compare touch finger ID with your stored touch id, if they are equal, set your stored finger id to -1 and perform your code that should execute on touch edned

    - on touch moved or (||) stationary:

    do the same comparison of the touch id like in the touch ended, and perform your code that should be executed if player will slide/move his finger, but do not modify your finger id variable.

    That`s it, works well with multiple buttons with multi touch.