diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml
index 1c4dcc890d9..3b5b6f7844b 100644
--- a/doc/classes/Tween.xml
+++ b/doc/classes/Tween.xml
@@ -228,6 +228,13 @@
[/codeblock]
+
+
+
+
+ If [param ignore] is [code]true[/code], the tween will ignore [member Engine.time_scale] and update with the real, elapsed time. This affects all [Tweener]s and their delays. Default value is [code]false[/code].
+
+
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index e1fd8abedeb..7a2c7643558 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -226,6 +226,15 @@ Tween::TweenPauseMode Tween::get_pause_mode() {
return pause_mode;
}
+Ref Tween::set_ignore_time_scale(bool p_ignore) {
+ ignore_time_scale = p_ignore;
+ return this;
+}
+
+bool Tween::is_ignoring_time_scale() const {
+ return ignore_time_scale;
+}
+
Ref Tween::set_parallel(bool p_parallel) {
default_parallel = p_parallel;
parallel_enabled = p_parallel;
@@ -451,6 +460,7 @@ void Tween::_bind_methods() {
ClassDB::bind_method(D_METHOD("bind_node", "node"), &Tween::bind_node);
ClassDB::bind_method(D_METHOD("set_process_mode", "mode"), &Tween::set_process_mode);
ClassDB::bind_method(D_METHOD("set_pause_mode", "mode"), &Tween::set_pause_mode);
+ ClassDB::bind_method(D_METHOD("set_ignore_time_scale", "ignore"), &Tween::set_ignore_time_scale, DEFVAL(true));
ClassDB::bind_method(D_METHOD("set_parallel", "parallel"), &Tween::set_parallel, DEFVAL(true));
ClassDB::bind_method(D_METHOD("set_loops", "loops"), &Tween::set_loops, DEFVAL(0));
diff --git a/scene/animation/tween.h b/scene/animation/tween.h
index 40e1da0ad3c..4b9ffbfae19 100644
--- a/scene/animation/tween.h
+++ b/scene/animation/tween.h
@@ -115,6 +115,7 @@ private:
int loops = 1;
int loops_done = 0;
float speed_scale = 1;
+ bool ignore_time_scale = false;
bool is_bound = false;
bool started = false;
@@ -161,6 +162,8 @@ public:
TweenProcessMode get_process_mode();
Ref set_pause_mode(TweenPauseMode p_mode);
TweenPauseMode get_pause_mode();
+ Ref set_ignore_time_scale(bool p_ignore = true);
+ bool is_ignoring_time_scale() const;
Ref set_parallel(bool p_parallel);
Ref set_loops(int p_loops);
diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp
index 986c1c64e77..10c47f9b7dc 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -701,7 +701,8 @@ void SceneTree::process_tweens(double p_delta, bool p_physics) {
continue;
}
- if (!E->get()->step(p_delta)) {
+ double time_step = E->get()->is_ignoring_time_scale() ? Engine::get_singleton()->get_process_step() : p_delta;
+ if (!E->get()->step(time_step)) {
E->get()->clear();
tweens.erase(E);
}