Hinge joints not reaching target position

I have a hinge that has the following settings:


Mass = 1
Ang Drag = 0
Constraints: frozen on all but Y-axis

Hinge Joint:

Spring = 1
Damper = 0.001
Target Position = 0

The problem being the hinge joint fluctuates around the target position yet does not stop at 0, but instead ± ~6 degrees. Turning up the spring helps, but fails aesthetically.

Also, in physics I turned sleep angular velocity to zero, which did not help.

I also tried switching the damper to 0 and angular drag to 0.05 (the default), which worked no better.

I wanted to script the hinge myself until I read changing a rigidbody’s angular velocity can yield unrealistic results.


Initially, I planned not to share my solution script, but after having to rewrite it, I decided to share it. This script is meant for a western style saloon door, which reacts to the player’s movement. Increasing the spring in the HingeJoint and the script will make the door swing faster (and vice-versa) and increasing the damper will make it slow down faster. (I put damper at .1 and spring at 1 for a nice slow western feel). Furthermore, the mass of the player should be at least a magnitude of 3 (ie 1000x) greater in order for the door to perform optimally without getting in the way of gameplay.

#pragma strict

//next 3 are cached variables to increase performance
var Trans : Transform;
var Rigid : Rigidbody;
var Hing : HingeJoint;

//resting position in Eulers.y for the (saloon) door
//ie where it is initially placed in the scene, called at start
var rest : float;
rest = Trans.eulerAngles.y;

function Update ()
    //this line makes sure we aren't checking when the door is at rest (optimization)
	if(Hing.spring.spring < 2)
		//when the door is barely moving
			//make the door swing faster, also stops sleep
			//(we don't necessarily want the door to sleep)
			Hing.spring.spring += Time.deltaTime;
			//if the door is approximately at resting position
				//make the door stop all angular velocity
				Rigid.angularVelocity.y = 0;
				//manually place the door at the resting position
				Trans.eulerAngles.y = rest;
				//manually force the door to sleep

function OnCollisionEnter ()
	//if this weren't here, the door spring would increment to infinity
	//making it swing super fast in the future, compounded each time the door is hit
	//AND continue to reach approximately plus or minus 6 degrees, not perfect equilibrium position
	Hing.spring.spring = 1;

I have the similar problem, because i use too small scale in my project ( unity have finite accuracy ) just try put your object to another empty object and rise him scale to see difference. I hope someone know how to change this defect without scale manipulation.