- 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
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                