Quick answer: Gamepad.current.SetMotorSpeeds(low, high). Both 0..1. Stop with (0, 0). Some controllers/drivers don’t support rumble.

Hit landed. Code calls SetMotorSpeeds. Controller silent. Either you grabbed a stale gamepad reference or the device doesn’t implement rumble.

The Fix

if (Gamepad.current is IDualMotorRumble rumble) {
    rumble.SetMotorSpeeds(0.4f, 0.7f);   // low, high
    StartCoroutine(StopRumble(0.2f));
}

IEnumerator StopRumble(float after) {
    yield return new WaitForSeconds(after);
    if (Gamepad.current is IDualMotorRumble r)
        r.SetMotorSpeeds(0, 0);
}

IDualMotorRumble check filters out unsupported controllers gracefully. Always remember to stop or rumble continues forever.

Verifying

Trigger rumble. Controller buzzes. Stop coroutine: silence after delay. Test with multiple controllers; some won’t implement.

“Check capability. Set speeds. Stop on cue.”

Related Issues

For Input composite, see composite. For control scheme, see scheme.

Capability check. Speeds set. Rumble fires.