Fixing Physics with Time Scaling in Godot

Slowing down your games speed can make key moments of gameplay so much more interesting. However, you can’t always just set Engine.time_scale without potentially having a few issues with your physics. You may notice that when you slow down time, rigid bodies tend to keep much more momentum. To fix this, you should scale your physics_ticks_per_second with your time_scale.

# Store the default physics ticks for reset
var base_physics_ticks: int = Engine.physics_ticks_per_second

func set_time_scale(target_time_scale: float) -> void:	
	# Scale physics_ticks by time_scale
	var target_iterations = int(base_physics_ticks * time_scale) 

	Engine.time_scale = target_time_scale
	Engine.physics_ticks_per_second = target_iterations


func reset_time_scale() -> void:
	# Reset to defaults
	Engine.time_scale = 1.0
	Engine.physics_ticks_per_second = base_physics_ticks

I would recommend adding these functions to an autoload so you can call these functions anywhere with Global.set_time_scale(float) and Global.reset_time_scale().