2D Rotation Z Stuck after hitting an object

I’ll guess that your Rigidbody is actually spinning and that your clamp code is holding it at a certain min/max 45-degree angle.

Your inputs are probably not strong enough to counteract the spinning, so each frame your inputs try to “unspin” it and it just respins that frame back to the max / min.

So two things:

  • set the rb.angularVelocity to zero each frame

  • do not set the rotation directly. Call rb.MoveRotation() instead. Here’s why:

With Physics (or Physics2D), never manipulate the Transform directly. If you manipulate the Transform directly, you are bypassing the physics system and you can reasonably expect glitching and missed collisions and other physics mayhem.

This means you may not change transform.position, transform.rotation, you may not call transform.Translate(), transform.Rotate() or other such methods, and also transform.localScale is off limits. You also cannot set rigidbody.position or rigidbody.rotation directly. These ALL bypass physics.

Always use the .MovePosition() and .MoveRotation() methods on the Rigidbody (or Rigidbody2D) instance in order to move or rotate things. Doing this keeps the physics system informed about what is going on.