diff --git a/doc/classes/Timer.xml b/doc/classes/Timer.xml index 09f3dba8cf4..f4fc58b9bf9 100644 --- a/doc/classes/Timer.xml +++ b/doc/classes/Timer.xml @@ -45,6 +45,9 @@ [b]Note:[/b] After the timer enters the tree, this property is automatically set to [code]false[/code]. [b]Note:[/b] This property does nothing when the timer is running in the editor. + + If [code]true[/code], the timer will ignore [member Engine.time_scale] and update with the real, elapsed time. + If [code]true[/code], the timer will stop after reaching the end. Otherwise, as by default, the timer will automatically restart. diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp index 0f4f18b495e..53c815f223e 100644 --- a/scene/main/timer.cpp +++ b/scene/main/timer.cpp @@ -48,7 +48,11 @@ void Timer::_notification(int p_what) { if (!processing || timer_process_callback == TIMER_PROCESS_PHYSICS || !is_processing_internal()) { return; } - time_left -= get_process_delta_time(); + if (ignore_time_scale) { + time_left -= Engine::get_singleton()->get_process_step(); + } else { + time_left -= get_process_delta_time(); + } if (time_left < 0) { if (!one_shot) { @@ -65,7 +69,11 @@ void Timer::_notification(int p_what) { if (!processing || timer_process_callback == TIMER_PROCESS_IDLE || !is_physics_processing_internal()) { return; } - time_left -= get_physics_process_delta_time(); + if (ignore_time_scale) { + time_left -= Engine::get_singleton()->get_process_step(); + } else { + time_left -= get_physics_process_delta_time(); + } if (time_left < 0) { if (!one_shot) { @@ -134,6 +142,14 @@ bool Timer::is_paused() const { return paused; } +void Timer::set_ignore_time_scale(bool p_ignore) { + ignore_time_scale = p_ignore; +} + +bool Timer::get_ignore_time_scale() { + return ignore_time_scale; +} + bool Timer::is_stopped() const { return get_time_left() <= 0; } @@ -206,6 +222,9 @@ void Timer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_paused", "paused"), &Timer::set_paused); ClassDB::bind_method(D_METHOD("is_paused"), &Timer::is_paused); + ClassDB::bind_method(D_METHOD("set_ignore_time_scale", "ignore"), &Timer::set_ignore_time_scale); + ClassDB::bind_method(D_METHOD("get_ignore_time_scale"), &Timer::get_ignore_time_scale); + ClassDB::bind_method(D_METHOD("is_stopped"), &Timer::is_stopped); ClassDB::bind_method(D_METHOD("get_time_left"), &Timer::get_time_left); @@ -220,6 +239,7 @@ void Timer::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "is_one_shot"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autostart"), "set_autostart", "has_autostart"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_paused", "is_paused"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_time_scale"), "set_ignore_time_scale", "get_ignore_time_scale"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_left", PROPERTY_HINT_NONE, "suffix:s", PROPERTY_USAGE_NONE), "", "get_time_left"); BIND_ENUM_CONSTANT(TIMER_PROCESS_PHYSICS); diff --git a/scene/main/timer.h b/scene/main/timer.h index d16e49793dd..de07343b567 100644 --- a/scene/main/timer.h +++ b/scene/main/timer.h @@ -41,6 +41,7 @@ class Timer : public Node { bool autostart = false; bool processing = false; bool paused = false; + bool ignore_time_scale = false; double time_left = -1.0; @@ -69,6 +70,9 @@ public: void set_paused(bool p_paused); bool is_paused() const; + void set_ignore_time_scale(bool p_ignore); + bool get_ignore_time_scale(); + bool is_stopped() const; double get_time_left() const;