add on_real_time_timer run condition (#10179)
# Objective Fixes #10177 . ## Solution Added a new run condition and tweaked the docs for `on_timer`. ## Changelog ### Added - `on_real_time_timer` run condition
This commit is contained in:
		
							parent
							
								
									4d286d087b
								
							
						
					
					
						commit
						b1cc7ad72f
					
				| @ -1,9 +1,9 @@ | |||||||
| use crate::{Time, Timer, TimerMode}; | use crate::{Real, Time, Timer, TimerMode}; | ||||||
| use bevy_ecs::system::Res; | use bevy_ecs::system::Res; | ||||||
| use bevy_utils::Duration; | use bevy_utils::Duration; | ||||||
| 
 | 
 | ||||||
| /// Run condition that is active on a regular time interval, using [`Time`] to advance
 | /// Run condition that is active on a regular time interval, using [`Time`] to advance
 | ||||||
| /// the timer.
 | /// the timer. The timer ticks at the rate of [`Time::relative_speed`].
 | ||||||
| ///
 | ///
 | ||||||
| /// ```rust,no_run
 | /// ```rust,no_run
 | ||||||
| /// # use bevy_app::{App, NoopPluginGroup as DefaultPlugins, PluginGroup, Update};
 | /// # use bevy_app::{App, NoopPluginGroup as DefaultPlugins, PluginGroup, Update};
 | ||||||
| @ -38,6 +38,42 @@ pub fn on_timer(duration: Duration) -> impl FnMut(Res<Time>) -> bool + Clone { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /// Run condition that is active on a regular time interval, using [`Time<Real>`] to advance
 | ||||||
|  | /// the timer. The timer ticks are not scaled.
 | ||||||
|  | ///
 | ||||||
|  | /// ```rust,no_run
 | ||||||
|  | /// # use bevy_app::{App, NoopPluginGroup as DefaultPlugins, PluginGroup, Update};
 | ||||||
|  | /// # use bevy_ecs::schedule::IntoSystemConfigs;
 | ||||||
|  | /// # use bevy_utils::Duration;
 | ||||||
|  | /// # use bevy_time::common_conditions::on_real_timer;
 | ||||||
|  | /// fn main() {
 | ||||||
|  | ///     App::new()
 | ||||||
|  | ///         .add_plugins(DefaultPlugins)
 | ||||||
|  | ///         .add_systems(Update, tick.run_if(on_real_timer(Duration::from_secs(1))))
 | ||||||
|  | ///         .run();
 | ||||||
|  | /// }
 | ||||||
|  | /// fn tick() {
 | ||||||
|  | ///     // ran once a second
 | ||||||
|  | /// }
 | ||||||
|  | /// ```
 | ||||||
|  | ///
 | ||||||
|  | /// Note that this does **not** guarantee that systems will run at exactly the
 | ||||||
|  | /// specified interval. If delta time is larger than the specified `duration` then
 | ||||||
|  | /// the system will only run once even though the timer may have completed multiple
 | ||||||
|  | /// times. This condition should only be used with large time durations (relative to
 | ||||||
|  | /// delta time).
 | ||||||
|  | ///
 | ||||||
|  | /// For more accurate timers, use the [`Timer`] class directly (see
 | ||||||
|  | /// [`Timer::times_finished_this_tick`] to address the problem mentioned above), or
 | ||||||
|  | /// use fixed timesteps that allow systems to run multiple times per frame.
 | ||||||
|  | pub fn on_real_timer(duration: Duration) -> impl FnMut(Res<Time<Real>>) -> bool + Clone { | ||||||
|  |     let mut timer = Timer::new(duration, TimerMode::Repeating); | ||||||
|  |     move |time: Res<Time<Real>>| { | ||||||
|  |         timer.tick(time.delta()); | ||||||
|  |         timer.just_finished() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[cfg(test)] | #[cfg(test)] | ||||||
| mod tests { | mod tests { | ||||||
|     use super::*; |     use super::*; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 SecretPocketCat
						SecretPocketCat