Slow Time for a single Rigid Body

I’m working on a project where the player can slow time on certain objects (or in an area), but I can’t figure out how to get this to apply to a rigid body. I need the rigidbody to fall/rotate/everything slower while affected, without messing up the rest of the game (anything not affected by the slow, for example). Other than being slower, it should act normally, and other things should interact with it correctly too (such as allowing the player to jump on it as it goes).

Is this possible, and/or how would it be done?

My first attempt was to try to personally handle the physics update with MovePosition and MoveRotation, manually applying the rigidbody’s velocity and angular velocity, like so:

float dt = Time.fixedDeltaTime * timeScale;
rigidbody.MovePosition( transform.position + rigidbody.velocity * dt );
rigidbody.MoveRotation( transform.rotation * Quaternion.Euler( rigidbody.angularVelocity * dt ) );

I’m not 100% sure that this would be the way to do these calculations, but either way it doesn’t work, because I can’t get the rigidbody to stop updating itself without setting it to kinematic, but then it won’t update things like gravity…any thoughts?

Is there any way to make a rigidbody stop moving itself, but still respond to all other collisions (so that I could potentially use MovePosition and MoveRotation, with my own timescale, while still maintaining normal behavior when hitting things)? I can make it kinematic, but then I can’t get it to collide.

Here’s the solution that I’m going with (for now, at least). It’ll probably need to get tweaked as I move along, and/or optimized (I don’t like all the division I have to do), but it seems to work for now. Thanks to HarshadK for links that helped me get this working. The code in Update() is just for testing.

bool first = true;
    private float _timeScale = 1;
    public float timeScale {
    	get { return _timeScale; }
    	set {
    		if( !first )
    			rigidbody.mass *= timeScale;
    			rigidbody.velocity /= timeScale;
    			rigidbody.angularVelocity /= timeScale;
    		first = false;
    		_timeScale = Mathf.Abs(value);
    		rigidbody.mass /= timeScale;
    		rigidbody.velocity *= timeScale;
    		rigidbody.angularVelocity *= timeScale;
    void Awake()
    	timeScale = _timeScale;
    void Update() {
    	timeScale = ( Input.GetButton("Fire2") ? 0.25f : 1 );
    void FixedUpdate () {
    	float dt = Time.fixedDeltaTime * timeScale;
    	rigidbody.velocity += Physics.gravity * dt;

Based on your [Edit2], you might want to take a look at Rigidbody.Sleep and Rigidbody Sleeping

Also for overall question, check answers to this question: Decreasing timescale for a single object and this one: How do I speed up the simulation of a rigidbody?

Try putting the code that worked in decelerating the rigid body into a trigger with OnTriggerStay().
So it will affect it while in there.

OnTriggerEnter() save the acceleration and then restore it with OnTriggerExit().

Yo need multiply the TIme.fixedDeltaTIme by Time.timeScale

Example runnig physics on 50 frames

Time.fixedDeltaTime = 0.02F * Time.timeScale;
Time.fixedDeltaTime = (1/50) * Time.timeScale;