How is fingerId correctly used in Unity?

I’m trying to implement 2 finger multitouch control for my simple shooting game, where one finger shot continuously affect the rotation of the player if first held down at the defined area lower at the screen, and the other controls the shooting button which can also be loaded to shoot more powerful bullets.

At first I tried storing the touch position when TouchPhase = Began in a Vector3 array with two places, with the other classes checking if and which one of the values in the array comply with the rule for starting their activity. The issue was that the finger index seems to drop down if an earlier finger is lifted, so if I pressed for example aiming → shot button and then lifted aiming the aiming button became stuck in loading as it was trying to track touch(1) which actually became (0).

The solution it seemed should be using fingerId, which produces a consistent number for a touch regardless of its index. The thing is - what I’m writing works even worse than before. It activates functions even when I’m pressing at the wrong places, so it seems the if statement complies even when it shouldn’t. What’s wrong with the code?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchControls : MonoBehaviour
{
    public static int aimID;
    public static int shootID;
    // Start is called before the first frame update
    void Start()
    {
        aimID = 0;
        shootID = 0;
    }

    // Update is called once per frame
    void Update()
    {
        for (int i = 0; i < Input.touchCount && i < 2; i++)
        {
            if (Input.GetTouch(i).phase == TouchPhase.Began)
            {
                Vector2 pos = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
                if (pos.x == Mathf.Clamp(pos.x, -2.5f * SceneScale.ratio, 2.5f * SceneScale.ratio) &&
                    pos.y <= Camera.main.ScreenToWorldPoint(new Vector3(0, 0, 0)).y + (2 * SceneScale.ratio))
                {
                    aimID = Input.GetTouch(i).fingerId;
                }
                else if (Vector2.Distance(pos, ShotButton.position) <= ShotButton.scale.x)
                {
                    shootID = Input.GetTouch(i).fingerId;
                }
            }
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Android;

public class ShotButton : MonoBehaviour
{
    public static bool[] time;
    static public Vector3 scale;
    static public Vector2 position;
    // Start is called before the first frame update
    void Start()
    {
        scale = gameObject.transform.localScale;
        position = new Vector2(gameObject.transform.position.x, gameObject.transform.position.y);
        time = new bool[2];
        time[0] = false;
        time[1] = false;
    }

    // Update is called once per frame
    public void FixedUpdate()
    {
        for (int i = 0; i < Input.touchCount && i < 2; i++)
        {
            time[i] = false;
            if (Input.GetTouch(i).fingerId == TouchControls.shootID)
            {
                time[i] = true;
            }
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public GameObject player;
    public static bool isDead = false;

    public float rot;
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    public void FixedUpdate()
    {
        for (int i = 0; i < Input.touchCount && i < 2; i++)
        {
            if (Input.GetTouch(i).fingerId == TouchControls.aimID)
            {
                rot = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position).x * 80 / (2.5f * SceneScale.ratio);
            }
        }
        rot = Mathf.Clamp(rot, -80, 80);
        player.transform.rotation = Quaternion.Euler(0, 0, rot);
    }
}

Thanks in advance.

I wrapped all this up in a few generic places within my proximitybuttons project, simply because getting into the nitty gritty of touches and crud like that all over the place is somewhat distasteful to me.

proximity_buttons is presently hosted at these locations:

https://bitbucket.org/kurtdekker/proximity_buttons

https://github.com/kurtdekker/proximity_buttons

You probably want one of the VAButtons for moving, combined with either one or two ProximityButtons, if your game is like a typical shooter. If you like you can look at the DemoSpaceShooter scene and see how that button layout is set up by the player controller script.