diff --git a/doc/classes/Timer.xml b/doc/classes/Timer.xml
index f8f9393847c6..00b2b039a07a 100644
--- a/doc/classes/Timer.xml
+++ b/doc/classes/Timer.xml
@@ -44,6 +44,8 @@
If [code]true[/code], the timer will start immediately when it enters the scene tree.
[b]Note:[/b] After the timer enters the tree, this property is automatically set to [code]false[/code].
+
+
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 0f4f18b495ea..45fedfd105ef 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::is_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("is_ignore_time_scale"), &Timer::is_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", "is_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 d16e49793ddd..319a52f3669b 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 @@ class Timer : public Node {
void set_paused(bool p_paused);
bool is_paused() const;
+ void set_ignore_time_scale(bool p_ignore);
+ bool is_ignore_time_scale();
+
bool is_stopped() const;
double get_time_left() const;