Advanced Touchscreen Camera Controls in Unity

Implementing Advanced Touch Controls

To handle multi-touch input, you’ll extend the basic touch control script to include pinch-to-zoom functionality.

  1. Script for Advanced Camera Movement:
using UnityEngine;

public class TouchCameraController : MonoBehaviour
{
    public Camera cam;

    private Vector2[] oldTouchPositions = { null, null };
    private Vector2 oldTouchVector;
    private float oldTouchDistance;

    void Update()
    {
        if (Input.touchCount == 0)
        {
            oldTouchPositions[0] = null;
            oldTouchPositions[1] = null;
        }
        else if (Input.touchCount == 1)
        {
            if (oldTouchPositions[0] == null || oldTouchPositions[1] != null)
            {
                oldTouchPositions[0] = Input.GetTouch(0).position;
                oldTouchPositions[1] = null;
            }
            else
            {
                Vector2 newTouchPosition = Input.GetTouch(0).position;

                cam.transform.position += transform.TransformDirection((Vector3)((oldTouchPositions[0] - newTouchPosition) * cam.orthographicSize / cam.pixelHeight * 2f));

                oldTouchPositions[0] = newTouchPosition;
            }
        }
        else
        {
            if (oldTouchPositions[1] == null)
            {
                oldTouchPositions[0] = Input.GetTouch(0).position;
                oldTouchPositions[1] = Input.GetTouch(1).position;
                oldTouchVector = (Vector2)(oldTouchPositions[0] - oldTouchPositions[1]);
                oldTouchDistance = oldTouchVector.magnitude;
            }
            else
            {
                Vector2 screen = new Vector2(cam.pixelWidth, cam.pixelHeight);

                Vector2[] newTouchPositions = { Input.GetTouch(0).position, Input.GetTouch(1).position };
                Vector2 newTouchVector = newTouchPositions[0] - newTouchPositions[1];
                float newTouchDistance = newTouchVector.magnitude;

                cam.transform.position += transform.TransformDirection((Vector3)((oldTouchPositions[0] + oldTouchPositions[1] - screen) * cam.orthographicSize / screen.y));
                cam.orthographicSize *= oldTouchDistance / newTouchDistance;
                cam.transform.position -= transform.TransformDirection((newTouchPositions[0] + newTouchPositions[1] - screen) * cam.orthographicSize / screen.y);

                oldTouchPositions[0] = newTouchPositions[0];
                oldTouchPositions[1] = newTouchPositions[1];
                oldTouchVector = newTouchVector;
                oldTouchDistance = newTouchDistance;
            }
        }
    }
}
  1. Attach the Script to the Camera:
  • Select the Main Camera in the Hierarchy window.
  • Drag the TouchCameraController script onto the Main Camera in the Inspector window.
  • Ensure the Camera component is assigned to the cam variable in the script.

Leave a comment

Your email address will not be published. Required fields are marked *