- Home /
Rigidbody.MovePosition doesn't move reliably?
I posted something similar a while back, and the answer I got (which was to put it in fixedUpdate) helped the problem a lot, but not completely. When I use Rigidbody.MovePosition or Rigidbody.MoveRotation, the object doesn't always move the correct distance. Sometimes it'll move a little farther than it should, or rotate too far around. Does anybody know what may be wrong? Here's my code, thanks for the help!
if(bIsSpinning == true)
{
if(spinDirection == "right")
{
rigidbody.MovePosition(rigidbody.position + Vector3(30,0,0) * Time.fixedDeltaTime);
rigidbody.MoveRotation(rigidbody.rotation * Quaternion.Euler(Vector3(0,360,0) * Time.fixedDeltaTime));
}
else if(spinDirection == "left")
{
rigidbody.MovePosition(rigidbody.position + Vector3(-30,0,0) * Time.deltaTime);
rigidbody.MoveRotation(rigidbody.rotation * Quaternion.Euler(Vector3(0,360,0) * Time.fixedDeltaTime));
}
if(spinDirection == "up")
{
rigidbody.MovePosition(rigidbody.position + Vector3(0,20,0) * Time.fixedDeltaTime);
}
else if(spinDirection == "down")
{
rigidbody.MovePosition(rigidbody.position + Vector3(0,-20,0) * Time.fixedDeltaTime * 3);
}
else
{
}
}
I don't know how to explain it to you. It's very hard to explain and my explanations sucks :/ But basiclly, what makes you rigidBody moving more or less than you desire is your "bIsSpinning". In this cases I advise you to use $$anonymous$$athf.Lerp
Try this:
private Vector3 oldPos;
private float timer;
private bool setOldPositionAndRotation;
if(bIsSpinning == true)
{
if(setOldPositionAndRotation == false)
{
setOldPositionAndRotation = true;
oldPos = rigibody.position;
}
timer += Time.fixedDeltaTime;
if(spinDirection == "right")
{
rigidbody.$$anonymous$$ovePosition($$anonymous$$athf.Lerp(oldPos, oldPos + Vector3(30,0,0), timer));
}
else if(spinDirection == "left")
{
rigidbody.$$anonymous$$ovePosition($$anonymous$$athf.Lerp(oldPos, oldPos + Vector3(-30,0,0), timer));
}
if(spinDirection == "up")
{
rigidbody.$$anonymous$$ovePosition($$anonymous$$athf.Lerp(oldPos, oldPos + Vector3(0,-20,0), timer));
}
else if(spinDirection == "down")
{
rigidbody.$$anonymous$$ovePosition($$anonymous$$athf.Lerp(oldPos, oldPos + Vector3(0,-20,0), timer * 3.0f));
}
}
else
{
setOldPositionAndRotation = false;
timer = 0;
}
I've done only for position. But for the rotation it is the same story.
Thanks for the reply! I tried your code, but I got a string of errors that all say
"The best overload for the method 'UnityEngine.$$anonymous$$athf.Lerp(float, float, float)' is not compatible with the argument list '(UnityEngine.Vector3, UnityEngine.Vector3, float)'"
or
"The best overload for the method 'UnityEngine.Rigidbody.$$anonymous$$ovePosition(UnityEngine.Vector3)' is not compatible with the argument list '(float)'"
Oh sorry my bad. I've should done this:
private Vector3 oldPos;
private float timer;
private bool setOldPositionAndRotation;
if(bIsSpinning == true)
{
if(setOldPositionAndRotation == false)
{
setOldPositionAndRotation = true;
oldPos = rigibody.position;
}
timer += Time.fixedDeltaTime;
if(spinDirection == "right")
{
rigidbody.$$anonymous$$ovePosition(new Vector3($$anonymous$$athf.Lerp(oldPos.x, oldPos.x + 30, timer),rididbody.position.y,rididbody.position.z));
}
else if(spinDirection == "left")
{
rigidbody.$$anonymous$$ovePosition(new Vector3($$anonymous$$athf.Lerp(oldPos.x, oldPos.x -30, timer),rididbody.position.y,rididbody.position.z));
}
if(spinDirection == "up")
{
rigidbody.$$anonymous$$ovePosition(new Vector3(rididbody.position.x,$$anonymous$$athf.Lerp(oldPos.y, oldPos.y -20, timer),rididbody.position.z));
}
else if(spinDirection == "down")
{
rigidbody.$$anonymous$$ovePosition(new Vector3(rididbody.position.x,$$anonymous$$athf.Lerp(oldPos.y, oldPos.y -20, timer * 3.0f),rididbody.position.z));
}
}
else
{
setOldPositionAndRotation = false;
timer = 0;
}
Answer by ZacGarby · May 11, 2015 at 09:53 AM
instead of having it in the 'update' function, have it in 'LateUpdate'
Your answer
Follow this Question
Related Questions
how to stop a player moving thought the walls in a 2d game 1 Answer
(2d in 3d) Movement relative to camera using JS 0 Answers
Rigidbody.MovePosition not working correctly in unity 2017 and higher 1 Answer
Problem changing 3rd Person controller rotation 1 Answer
Remove Force from Moving Object 1 Answer