As for as I understand, the SmoothDamp function will never actually reach its target, just forvever approach it. Is there a way to force it to arrive at its target? Im using it to de-accelerate my player and the player seemingly eventually stops, but is always moving VERY slightly. This complicates some of my other coding.
I found a solution that might work for other people, which consists on reducing, on each iteration, the value of the smoothTime parameter. This will result in the smooth damp going faster by the end, instead of going slower and slower, thus it will reach its target faster.
Note that if you’re changing the value for smoothTime (which is 1.1f in the example) you might have to change smoothTimeChange.
IEnumerator SmoothDampExample()
{
// Say this is your target position
var targetPosition = new Vector3(someX, someY, someZ);
// This is your initial smooth time
float smoothTime = 1.1f;
// This is the amount you will be reducing smoothTime on each iteartion
float smoothTimeChange = 0.0075f;
// Store the result of smooth damp here
Vector3 newPosition;
// current smooth velocity
float currentSmoothVelocity;
// Let's say we want to move this component's transform position.
// We will do this until smooth damp is done.
while (true) {
// Get the new position
newPosition = Vector3.SmoothDamp(transform.position, targetPosition, ref currentSmoothVelocity, smoothTime);
// If new position equals to current position, it means
// it didn't change. SmoothDamp never actually reaches its target,
// so when it doesn't move it's when we know it is done.
if (newPosition == transform.position) {
break;
}
// Set new position
transform.position = newPosition;
// Reduce smoothTime so SmoothDamp will go faster
smoothTime = smoothTime - smoothTimeChange;
// Wait for next frame
yield return null;
}
// Smooth damp is done!
}