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.