gamai/node/
run_timer.rs

1use crate::prelude::*;
2use bevy_ecs::prelude::*;
3use bevy_time::Stopwatch;
4use bevy_time::Time;
5use std::fmt::Debug;
6
7/// Tracks the last time a node was run.
8#[derive(Default, Debug, Component)]
9pub struct RunTimer {
10	/// Last time the node was last started, or time since level load if never started.
11	pub last_started: Stopwatch,
12	/// Last time the node was last stopped, or time since level load if never stopped.
13	pub last_stopped: Stopwatch,
14}
15
16
17
18
19/// Syncs [`RunTimer`] components, by default added to [`PreNodeUpdateSet`].
20pub fn sync_run_timers(
21	time: Res<Time>,
22	mut timers: Query<&mut RunTimer>,
23	added: Query<Entity, Added<Running>>,
24	mut removed: RemovedComponents<Running>,
25) {
26	for mut timer in timers.iter_mut() {
27		timer.last_started.tick(time.delta());
28		timer.last_stopped.tick(time.delta());
29	}
30
31	for added in added.iter() {
32		if let Ok(mut timer) = timers.get_mut(added) {
33			timer.last_started.reset();
34		}
35	}
36
37	for removed in removed.read() {
38		if let Ok(mut timer) = timers.get_mut(removed) {
39			timer.last_stopped.reset();
40		}
41	}
42}