Quick answer: Call EnhancedTouchSupport.Enable() at startup, check Touchscreen.current for null on non-touch platforms, and read touch state in Update (not Awake). Editor simulation can lie; verify on actual hardware.

Here is how to fix Unity New Input System where touchscreen presses do not arrive. You write Touchscreen.current.primaryTouch.press.wasPressedThisFrame and never get true. The cause is one of: enhanced touch disabled, Touchscreen null because the device has no touch, or reading state too early in the frame.

The Symptom

On a touch device (mobile, tablet), tapping the screen produces no input event. Other input (keyboard fallback) works. The Input Debugger window shows touch events arriving but your code does not react.

What Causes This

EnhancedTouchSupport disabled. The high-level Touch API requires explicit enabling. Without it, UnityEngine.InputSystem.EnhancedTouch.Touch.activeFingers is always empty.

Touchscreen.current is null. On desktop, no touchscreen device exists. Direct access throws NullReferenceException; logged as Missing Reference and your handler is skipped.

Reading in Awake. Awake runs before the InputSystem registers devices. Touchscreen.current may be null at Awake but valid by Start.

Editor simulation differences. Unity’s editor touch sim sometimes simulates only first-finger events. Multi-touch needs a real device.

The Fix

Step 1: Enable enhanced touch.

using UnityEngine;
using UnityEngine.InputSystem.EnhancedTouch;

public class TouchBootstrap : MonoBehaviour
{
    void Awake()
    {
        EnhancedTouchSupport.Enable();
        DontDestroyOnLoad(gameObject);
    }
}

Drop on a bootstrap object. Enhanced touch stays enabled for the session.

Step 2: Null-check Touchscreen.

using UnityEngine.InputSystem;

void Update()
{
    var ts = Touchscreen.current;
    if (ts == null) return;

    if (ts.primaryTouch.press.wasPressedThisFrame)
    {
        Vector2 pos = ts.primaryTouch.position.ReadValue();
        Debug.Log($"Tap at {pos}");
    }
}

Step 3: Use the Touch class for multi-finger tracking.

using UnityEngine.InputSystem.EnhancedTouch;

void Update()
{
    foreach (Touch t in Touch.activeTouches)
    {
        if (t.phase == TouchPhase.Began) OnTouchBegan(t);
    }
}

Touch.activeTouches works correctly only after EnhancedTouchSupport.Enable.

Step 4: Subscribe to fingerDown events for callback-style handling.

void OnEnable()
{
    Touch.onFingerDown += OnFingerDown;
}

void OnDisable()
{
    Touch.onFingerDown -= OnFingerDown;
}

void OnFingerDown(Finger f)
{
    Debug.Log($"Finger {f.index} down at {f.screenPosition}");
}

Step 5: Test on a real device. Editor simulation can miss events. For iOS/Android, build a development APK/IPA and verify touch fires there. Use Window → Analysis → Input Debugger to inspect device state during testing.

Common Pitfalls

Reading primaryTouch position when no touch is active returns zero, which can look like a valid (0, 0) position. Always check press.isPressed before reading position.

Mixing the legacy Input.touchCount API with the new system. Pick one and stick with it; mixing produces inconsistent state.

“EnhancedTouchSupport.Enable() once. Null-check Touchscreen. Touch.activeTouches for fingers. The taps register.”

Related Issues

For control scheme switching, see Control Scheme Switching. For .inputactions reload, see Input Actions Asset Reload.

Enable enhanced touch. Null-check Touchscreen. Read in Update. Test on device. Touches arrive.