diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index 1c4dcc890d..3b5b6f7844 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 e1fd8abede..7a2c764355 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 40e1da0ad3..4b9ffbfae1 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 986c1c64e7..10c47f9b7d 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); }