pub struct Timer { /* private fields */ }Expand description
Tracks elapsed time. Enters the finished state once duration is reached.
Note that in order to advance the timer tick MUST be called.
§Timer modes
There are two timer modes (TimerMode):
- Non repeating timers will stop tracking and stay in the finished state until reset.
- Repeating timers will only be in the finished state on each tick
durationis reached or exceeded, and can still be reset at any given point.
§Pausing timers
You can pause a timer using Timer::pause. Paused timers will not have elapsed time increased.
§Elapsing multiple times a frame
Repeating timers might elapse multiple times per frame if the time is advanced by more than the timer duration.
You can check how many times a timer elapsed each tick with Timer::times_finished_this_tick.
For non-repeating timers, this will always be 0 or 1.
Implementations§
Source§impl Timer
impl Timer
Sourcepub fn new(duration: Duration, mode: TimerMode) -> Timer
pub fn new(duration: Duration, mode: TimerMode) -> Timer
Creates a new timer with a given duration.
See also Timer::from_seconds.
Examples found in repository?
More examples
9fn main() {
10 App::new()
11 .add_plugins(DefaultPlugins)
12 .insert_resource(TargetScale {
13 start_scale: 1.0,
14 target_scale: 1.0,
15 target_time: Timer::new(Duration::from_millis(SCALE_TIME), TimerMode::Once),
16 })
17 .add_systems(Startup, setup)
18 .add_systems(
19 Update,
20 (change_scaling, apply_scaling.after(change_scaling)),
21 )
22 .run();
23}281fn spawn_decal(
282 mut commands: Commands,
283 app_status: Res<AppStatus>,
284 app_textures: Res<AppTextures>,
285 time: Res<Time>,
286 mut decal_spawn_timer: Local<Option<Timer>>,
287 mut seeded_rng: ResMut<SeededRng>,
288) {
289 // Tick the decal spawn timer. Check to see if we should spawn a new decal,
290 // and bail out if it's not yet time to.
291 let decal_spawn_timer = decal_spawn_timer
292 .get_or_insert_with(|| Timer::new(Duration::from_millis(1000), TimerMode::Repeating));
293 decal_spawn_timer.tick(time.delta());
294 if !decal_spawn_timer.just_finished() {
295 return;
296 }
297
298 // Generate a random position along the plane.
299 let decal_position = vec3(
300 seeded_rng.0.random_range(-PLANE_HALF_SIZE..PLANE_HALF_SIZE),
301 seeded_rng.0.random_range(-PLANE_HALF_SIZE..PLANE_HALF_SIZE),
302 0.0,
303 );
304
305 // Generate a random size for the decal.
306 let decal_size = seeded_rng.0.random_range(DECAL_MIN_SIZE..DECAL_MAX_SIZE);
307
308 // Generate a random rotation for the decal.
309 let theta = seeded_rng.0.random_range(0.0f32..PI);
310
311 // Now spawn the decal.
312 commands.spawn((
313 // Apply the textures.
314 ClusteredDecal {
315 base_color_texture: Some(app_textures.decal_base_color_texture.clone()),
316 normal_map_texture: Some(app_textures.decal_normal_map_texture.clone()),
317 metallic_roughness_texture: Some(
318 app_textures.decal_metallic_roughness_map_texture.clone(),
319 ),
320 emissive_texture: if app_status.emissive_decals {
321 Some(app_textures.decal_emissive_texture.clone())
322 } else {
323 None
324 },
325 ..ClusteredDecal::default()
326 },
327 // Spawn the decal at the right place. Note that the scale is initially
328 // zero; we'll animate it later.
329 Transform::from_translation(decal_position)
330 .with_scale(Vec3::ZERO)
331 .looking_to(Vec3::Z, Vec3::ZERO.with_xy(Vec2::from_angle(theta))),
332 // Create the component that tracks the animation state.
333 ExampleDecal {
334 size: decal_size,
335 state: ExampleDecalState::AnimatingIn(Timer::new(
336 DECAL_ANIMATE_IN_DURATION,
337 TimerMode::Once,
338 )),
339 },
340 ));
341}
342
343/// A system that animates the decals growing as they enter and shrinking as
344/// they leave.
345fn animate_decals(
346 mut commands: Commands,
347 mut decals_query: Query<(Entity, &mut ExampleDecal, &mut Transform)>,
348 time: Res<Time>,
349) {
350 for (decal_entity, mut example_decal, mut decal_transform) in decals_query.iter_mut() {
351 // Update the animation timers, and advance the animation state if the
352 // timer has expired.
353 match example_decal.state {
354 ExampleDecalState::AnimatingIn(ref mut timer) => {
355 timer.tick(time.delta());
356 if timer.just_finished() {
357 example_decal.state =
358 ExampleDecalState::Idling(Timer::new(DECAL_IDLE_DURATION, TimerMode::Once));
359 }
360 }
361 ExampleDecalState::Idling(ref mut timer) => {
362 timer.tick(time.delta());
363 if timer.just_finished() {
364 example_decal.state = ExampleDecalState::AnimatingOut(Timer::new(
365 DECAL_ANIMATE_OUT_DURATION,
366 TimerMode::Once,
367 ));
368 }
369 }
370 ExampleDecalState::AnimatingOut(ref mut timer) => {
371 timer.tick(time.delta());
372 if timer.just_finished() {
373 commands.entity(decal_entity).despawn();
374 continue;
375 }
376 }
377 }
378
379 // Actually animate the decal by adjusting its transform.
380 // All we have to do here is to compute the decal's scale as a fraction
381 // of its full size.
382 let new_decal_scale_factor = match example_decal.state {
383 ExampleDecalState::AnimatingIn(ref timer) => timer.fraction(),
384 ExampleDecalState::Idling(_) => 1.0,
385 ExampleDecalState::AnimatingOut(ref timer) => timer.fraction_remaining(),
386 };
387 decal_transform.scale =
388 Vec3::splat(example_decal.size * new_decal_scale_factor).with_z(1.0);
389 }
390}Sourcepub fn from_seconds(duration: f32, mode: TimerMode) -> Timer
pub fn from_seconds(duration: f32, mode: TimerMode) -> Timer
Creates a new timer with a given duration in seconds.
§Example
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);Examples found in repository?
More examples
- examples/showcase/contributors.rs
- examples/ui/text/font_atlas_debug.rs
- examples/time/timers.rs
- examples/ecs/generic_system.rs
- examples/ui/navigation/directional_navigation.rs
- examples/ui/navigation/directional_navigation_overrides.rs
- examples/shader/array_texture.rs
- examples/audio/soundtrack.rs
- examples/ecs/state_scoped.rs
- examples/showcase/alien_cake_addict.rs
- examples/2d/sprite_sheet.rs
- examples/showcase/game_menu.rs
- examples/usage/cooldown.rs
- examples/animation/animated_mesh_events.rs
- examples/gltf/gltf_extension_animation_graph.rs
- examples/picking/sprite_picking.rs
- examples/usage/debug_frustum_culling.rs
- examples/2d/tilemap_chunk.rs
- examples/stress_tests/many_animated_sprites.rs
- examples/stress_tests/many_animated_sprite_meshes.rs
- examples/2d/sprite_scale.rs
Sourcepub fn is_finished(&self) -> bool
pub fn is_finished(&self) -> bool
Returns true if the timer has reached its duration.
For repeating timers, this method behaves identically to Timer::just_finished.
§Examples
use std::time::Duration;
let mut timer_once = Timer::from_seconds(1.0, TimerMode::Once);
timer_once.tick(Duration::from_secs_f32(1.5));
assert!(timer_once.is_finished());
timer_once.tick(Duration::from_secs_f32(0.5));
assert!(timer_once.is_finished());
let mut timer_repeating = Timer::from_seconds(1.0, TimerMode::Repeating);
timer_repeating.tick(Duration::from_secs_f32(1.1));
assert!(timer_repeating.is_finished());
timer_repeating.tick(Duration::from_secs_f32(0.8));
assert!(!timer_repeating.is_finished());
timer_repeating.tick(Duration::from_secs_f32(0.6));
assert!(timer_repeating.is_finished());Examples found in repository?
More examples
102 fn countdown(
103 mut game_state: ResMut<NextState<GameState>>,
104 time: Res<Time>,
105 mut timer: ResMut<SplashTimer>,
106 ) {
107 if timer.tick(time.delta()).is_finished() {
108 game_state.set(GameState::Menu);
109 }
110 }
111}
112
113mod game {
114 use bevy::{
115 color::palettes::basic::{BLUE, LIME},
116 prelude::*,
117 };
118
119 use super::{DisplayQuality, GameState, Volume, TEXT_COLOR};
120
121 // This plugin will contain the game. In this case, it's just be a screen that will
122 // display the current settings for 5 seconds before returning to the menu
123 pub fn game_plugin(app: &mut App) {
124 app.add_systems(OnEnter(GameState::Game), game_setup)
125 .add_systems(Update, game.run_if(in_state(GameState::Game)));
126 }
127
128 // Tag component used to tag entities added on the game screen
129 #[derive(Component)]
130 struct OnGameScreen;
131
132 #[derive(Resource, Deref, DerefMut)]
133 struct GameTimer(Timer);
134
135 fn game_setup(
136 mut commands: Commands,
137 display_quality: Res<DisplayQuality>,
138 volume: Res<Volume>,
139 ) {
140 commands.spawn((
141 DespawnOnExit(GameState::Game),
142 Node {
143 width: percent(100),
144 height: percent(100),
145 // center children
146 align_items: AlignItems::Center,
147 justify_content: JustifyContent::Center,
148 ..default()
149 },
150 OnGameScreen,
151 children![(
152 Node {
153 // This will display its children in a column, from top to bottom
154 flex_direction: FlexDirection::Column,
155 // `align_items` will align children on the cross axis. Here the main axis is
156 // vertical (column), so the cross axis is horizontal. This will center the
157 // children
158 align_items: AlignItems::Center,
159 ..default()
160 },
161 BackgroundColor(Color::BLACK),
162 children![
163 (
164 Text::new("Will be back to the menu shortly..."),
165 TextFont {
166 font_size: FontSize::Px(67.0),
167 ..default()
168 },
169 TextColor(TEXT_COLOR),
170 Node {
171 margin: UiRect::all(px(50)),
172 ..default()
173 },
174 ),
175 (
176 Text::default(),
177 Node {
178 margin: UiRect::all(px(50)),
179 ..default()
180 },
181 children![
182 (
183 TextSpan(format!("quality: {:?}", *display_quality)),
184 TextFont {
185 font_size: FontSize::Px(50.0),
186 ..default()
187 },
188 TextColor(BLUE.into()),
189 ),
190 (
191 TextSpan::new(" - "),
192 TextFont {
193 font_size: FontSize::Px(50.0),
194 ..default()
195 },
196 TextColor(TEXT_COLOR),
197 ),
198 (
199 TextSpan(format!("volume: {:?}", *volume)),
200 TextFont {
201 font_size: FontSize::Px(50.0),
202 ..default()
203 },
204 TextColor(LIME.into()),
205 ),
206 ]
207 ),
208 ]
209 )],
210 ));
211 // Spawn a 5 seconds timer to trigger going back to the menu
212 commands.insert_resource(GameTimer(Timer::from_seconds(5.0, TimerMode::Once)));
213 }
214
215 // Tick the timer, and change state when finished
216 fn game(
217 time: Res<Time>,
218 mut game_state: ResMut<NextState<GameState>>,
219 mut timer: ResMut<GameTimer>,
220 ) {
221 if timer.tick(time.delta()).is_finished() {
222 game_state.set(GameState::Menu);
223 }
224 }173fn toggle(
174 time: Res<Time>,
175 mut timer: ResMut<TickTock>,
176 state: Res<State<GameState>>,
177 mut next_state: ResMut<NextState<GameState>>,
178) {
179 if !timer.0.tick(time.delta()).is_finished() {
180 return;
181 }
182 *next_state = match state.get() {
183 GameState::A => NextState::Pending(GameState::B),
184 GameState::B => NextState::Pending(GameState::C(1)),
185 GameState::C(_) => NextState::Pending(GameState::A),
186 }
187}115fn execute_animation(time: Res<Time>, mut query: Query<(&mut AnimationConfig, &mut CursorIcon)>) {
116 for (mut config, mut cursor_icon) in &mut query {
117 if let CursorIcon::Custom(CustomCursor::Image(ref mut image)) = *cursor_icon {
118 config.frame_timer.tick(time.delta());
119
120 if config.frame_timer.is_finished()
121 && let Some(atlas) = image.texture_atlas.as_mut()
122 {
123 atlas.index += config.increment;
124
125 if atlas.index > config.last_sprite_index {
126 atlas.index = config.first_sprite_index;
127 }
128
129 config.frame_timer = AnimationConfig::timer_from_fps(config.fps);
130 }
131 }
132 }
133}Sourcepub fn just_finished(&self) -> bool
pub fn just_finished(&self) -> bool
Returns true only on the tick the timer reached its duration.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(1.5));
assert!(timer.just_finished());
timer.tick(Duration::from_secs_f32(0.5));
assert!(!timer.just_finished());Examples found in repository?
More examples
142fn print_light_count(time: Res<Time>, mut timer: Local<PrintingTimer>, lights: Query<&PointLight>) {
143 timer.0.tick(time.delta());
144
145 if timer.0.just_finished() {
146 info!("Lights: {}", lights.iter().len());
147 }
148}
149
150struct LogVisibleLights;
151
152impl Plugin for LogVisibleLights {
153 fn build(&self, app: &mut App) {
154 let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
155 return;
156 };
157
158 render_app.add_systems(
159 Render,
160 print_visible_light_count.in_set(RenderSystems::Prepare),
161 );
162 }
163}
164
165// System for printing the number of meshes on every tick of the timer
166fn print_visible_light_count(
167 time: Res<Time>,
168 mut timer: Local<PrintingTimer>,
169 visible: Query<&ExtractedPointLight>,
170 global_clusterable_object_meta: Res<GlobalClusterableObjectMeta>,
171) {
172 timer.0.tick(time.delta());
173
174 if timer.0.just_finished() {
175 // Note that it's not generally a safe assumption that the number of
176 // lights equals the number of clusterable objects, since some objects
177 // other than lights are clusterable. However, in this specific example,
178 // the only clusterable objects are lights.
179 info!(
180 "Visible Lights: {}, Rendered Lights: {}",
181 visible.iter().len(),
182 global_clusterable_object_meta.entity_to_index.len()
183 );
184 }
185}48fn print_when_completed(time: Res<Time>, mut query: Query<&mut PrintOnCompletionTimer>) {
49 for mut timer in &mut query {
50 if timer.tick(time.delta()).just_finished() {
51 info!("Entity timer just finished");
52 }
53 }
54}
55
56/// This system controls ticking the timer within the countdown resource and
57/// handling its state.
58fn countdown(time: Res<Time>, mut countdown: ResMut<Countdown>) {
59 countdown.main_timer.tick(time.delta());
60
61 // The API encourages this kind of timer state checking (if you're only checking for one value)
62 // Additionally, `is_finished()` would accomplish the same thing as `just_finished` due to the
63 // timer being repeating, however this makes more sense visually.
64 if countdown.percent_trigger.tick(time.delta()).just_finished() {
65 if !countdown.main_timer.is_finished() {
66 // Print the percent complete the main timer is.
67 info!(
68 "Timer is {:0.0}% complete!",
69 countdown.main_timer.fraction() * 100.0
70 );
71 } else {
72 // The timer has finished so we pause the percent output timer
73 countdown.percent_trigger.pause();
74 info!("Paused percent trigger timer");
75 }
76 }
77}- examples/ui/navigation/directional_navigation.rs
- examples/ui/navigation/directional_navigation_overrides.rs
- examples/stress_tests/many_cubes.rs
- examples/audio/soundtrack.rs
- examples/ui/text/font_atlas_debug.rs
- examples/2d/sprite_scale.rs
- examples/2d/sprite_sheet.rs
- examples/2d/tilemap_chunk.rs
- examples/picking/sprite_picking.rs
- examples/stress_tests/many_animated_sprites.rs
- examples/stress_tests/many_animated_sprite_meshes.rs
- examples/shader/array_texture.rs
- examples/animation/animated_mesh_events.rs
- examples/gltf/gltf_extension_animation_graph.rs
- examples/usage/cooldown.rs
- examples/stress_tests/many_text2d.rs
- examples/2d/sprite_animation.rs
- examples/showcase/contributors.rs
- examples/3d/clustered_decal_maps.rs
Sourcepub fn elapsed(&self) -> Duration
pub fn elapsed(&self) -> Duration
Returns the time elapsed on the timer. Guaranteed to be between 0.0 and duration.
Will only equal duration when the timer is finished and non repeating.
See also Stopwatch::elapsed.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.elapsed(), Duration::from_secs_f32(0.5));Sourcepub fn elapsed_secs(&self) -> f32
pub fn elapsed_secs(&self) -> f32
Returns the time elapsed on the timer as an f32.
See also Timer::elapsed.
Examples found in repository?
101fn fade_in(
102 mut commands: Commands,
103 mut audio_sink: Query<(&mut AudioSink, Entity), With<FadeIn>>,
104 timer: Res<GameStateTimer>,
105) {
106 for (mut audio, entity) in audio_sink.iter_mut() {
107 audio.set_volume(
108 Volume::SILENT.fade_towards(Volume::Linear(1.0), timer.0.elapsed_secs() / FADE_TIME),
109 );
110 if timer.0.elapsed_secs() >= FADE_TIME {
111 audio.set_volume(Volume::Linear(1.0));
112 commands.entity(entity).remove::<FadeIn>();
113 }
114 }
115}
116
117// Fades out the audio of entities that has the FadeOut component. Despawns the entities once audio
118// volume reaches zero.
119fn fade_out(
120 mut commands: Commands,
121 mut audio_sink: Query<(&mut AudioSink, Entity), With<FadeOut>>,
122 timer: Res<GameStateTimer>,
123) {
124 for (mut audio, entity) in audio_sink.iter_mut() {
125 audio.set_volume(
126 Volume::Linear(1.0).fade_towards(Volume::SILENT, timer.0.elapsed_secs() / FADE_TIME),
127 );
128 if timer.0.elapsed_secs() >= FADE_TIME {
129 commands.entity(entity).despawn();
130 }
131 }
132}More examples
266fn move_shapes(
267 time: Res<Time>,
268 mut timer: Local<Timer>,
269 mut ring_query: Query<&mut Transform, (With<ShapeRing>, Without<MyShape>)>,
270 mut shape_query: Query<(&mut Transform, Has<WallShape>), (With<MyShape>, Without<ShapeRing>)>,
271) -> Result {
272 // Initialize the wall shape's movement timer on the first run.
273 if timer.duration().is_zero() {
274 *timer = Timer::from_seconds(WALL_SHAPE_TIMER_DURATION_SECS, TimerMode::Repeating);
275 }
276 timer.tick(time.delta());
277 let dt = time.delta_secs();
278
279 // Rotate the shapes themselves on their own axis
280 for (mut transform, has_wall_shape) in &mut shape_query {
281 transform.rotate_y(dt / 2.);
282 if has_wall_shape {
283 // the wall shape moves up for 4 seconds and then down for 4 seconds.
284 // it oscillates between y = 1.5 and 15.0
285 transform.translation.y = if timer.elapsed_secs() < WALL_SHAPE_TIMER_DURATION_SECS / 2.0
286 {
287 1.5 + 15.0 * timer.elapsed_secs() / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
288 } else {
289 1.5 + 15.0 * (WALL_SHAPE_TIMER_DURATION_SECS - timer.elapsed_secs())
290 / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
291 }
292 }
293 }
294
295 // Rotate the ring
296 let transform = &mut ring_query.single_mut()?;
297 transform.rotate_y(dt / 3.);
298
299 Ok(())
300}Sourcepub fn elapsed_secs_f64(&self) -> f64
pub fn elapsed_secs_f64(&self) -> f64
Returns the time elapsed on the timer as an f64.
See also Timer::elapsed.
Sourcepub fn set_elapsed(&mut self, time: Duration)
pub fn set_elapsed(&mut self, time: Duration)
Sets the elapsed time of the timer without any other considerations.
See also Stopwatch::set.
§
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.set_elapsed(Duration::from_secs(2));
assert_eq!(timer.elapsed(), Duration::from_secs(2));
// the timer is not finished even if the elapsed time is greater than the duration.
assert!(!timer.is_finished());Examples found in repository?
47fn setup(
48 mut commands: Commands,
49 assets: Res<AssetServer>,
50 mut texture_atlases: ResMut<Assets<TextureAtlasLayout>>,
51) {
52 warn!(include_str!("warning_string.txt"));
53
54 let mut rng = rand::rng();
55
56 let tile_size = Vec2::splat(64.0);
57 let map_size = Vec2::splat(320.0);
58
59 let half_x = (map_size.x / 2.0) as i32;
60 let half_y = (map_size.y / 2.0) as i32;
61
62 let texture_handle = assets.load("textures/rpg/chars/gabe/gabe-idle-run.png");
63 let texture_atlas = TextureAtlasLayout::from_grid(UVec2::splat(24), 7, 1, None, None);
64 let texture_atlas_handle = texture_atlases.add(texture_atlas);
65
66 // Spawns the camera
67
68 commands.spawn(Camera2d);
69
70 // Builds and spawns the sprites
71 for y in -half_y..half_y {
72 for x in -half_x..half_x {
73 let position = Vec2::new(x as f32, y as f32);
74 let translation = (position * tile_size).extend(rng.random::<f32>());
75 let rotation = Quat::from_rotation_z(rng.random::<f32>());
76 let scale = Vec3::splat(rng.random::<f32>() * 2.0);
77 let mut timer = Timer::from_seconds(0.1, TimerMode::Repeating);
78 timer.set_elapsed(Duration::from_secs_f32(rng.random::<f32>()));
79
80 commands.spawn((
81 Sprite {
82 image: texture_handle.clone(),
83 texture_atlas: Some(TextureAtlas::from(texture_atlas_handle.clone())),
84 custom_size: Some(tile_size),
85 ..default()
86 },
87 Transform {
88 translation,
89 rotation,
90 scale,
91 },
92 AnimationTimer(timer),
93 ));
94 }
95 }
96}More examples
49fn setup(
50 mut commands: Commands,
51 assets: Res<AssetServer>,
52 mut texture_atlases: ResMut<Assets<TextureAtlasLayout>>,
53) {
54 warn!(include_str!("warning_string.txt"));
55
56 let mut rng = rand::rng();
57
58 let tile_size = Vec2::splat(64.0);
59 let map_size = Vec2::splat(320.0);
60
61 let half_x = (map_size.x / 2.0) as i32;
62 let half_y = (map_size.y / 2.0) as i32;
63
64 let texture_handle = assets.load("textures/rpg/chars/gabe/gabe-idle-run.png");
65 let texture_atlas = TextureAtlasLayout::from_grid(UVec2::splat(24), 7, 1, None, None);
66 let texture_atlas_handle = texture_atlases.add(texture_atlas);
67
68 // Spawns the camera
69
70 commands.spawn(Camera2d);
71
72 // Builds and spawns the sprites
73 for y in -half_y..half_y {
74 for x in -half_x..half_x {
75 let position = Vec2::new(x as f32, y as f32);
76 let translation = (position * tile_size).extend(rng.random::<f32>());
77 let rotation = Quat::from_rotation_z(rng.random::<f32>());
78 let scale = Vec3::splat(rng.random::<f32>() * 2.0);
79 let mut timer = Timer::from_seconds(0.1, TimerMode::Repeating);
80 timer.set_elapsed(Duration::from_secs_f32(rng.random::<f32>()));
81
82 commands.spawn((
83 SpriteMesh {
84 image: texture_handle.clone(),
85 texture_atlas: Some(TextureAtlas::from(texture_atlas_handle.clone())),
86 custom_size: Some(tile_size),
87 ..default()
88 },
89 Transform {
90 translation,
91 rotation,
92 scale,
93 },
94 AnimationTimer(timer),
95 ));
96 }
97 }
98}Sourcepub fn duration(&self) -> Duration
pub fn duration(&self) -> Duration
Returns the duration of the timer.
§Examples
use std::time::Duration;
let timer = Timer::new(Duration::from_secs(1), TimerMode::Once);
assert_eq!(timer.duration(), Duration::from_secs(1));Examples found in repository?
75fn update_mesh_tags(time: Res<Time>, mut query: Query<&mut MeshTag>, mut timer: Local<Timer>) {
76 // Initialize the timer on the first run.
77 if timer.duration().is_zero() {
78 *timer = Timer::from_seconds(1.5, TimerMode::Repeating);
79 }
80
81 timer.tick(time.delta());
82 if timer.just_finished() {
83 for mut tag in query.iter_mut() {
84 // Cycle through the texture layers to demonstrate that we can
85 // select different layers of the array texture at runtime.
86 tag.0 = (tag.0 + 1) % TEXTURE_COUNT;
87 }
88 }
89}More examples
266fn move_shapes(
267 time: Res<Time>,
268 mut timer: Local<Timer>,
269 mut ring_query: Query<&mut Transform, (With<ShapeRing>, Without<MyShape>)>,
270 mut shape_query: Query<(&mut Transform, Has<WallShape>), (With<MyShape>, Without<ShapeRing>)>,
271) -> Result {
272 // Initialize the wall shape's movement timer on the first run.
273 if timer.duration().is_zero() {
274 *timer = Timer::from_seconds(WALL_SHAPE_TIMER_DURATION_SECS, TimerMode::Repeating);
275 }
276 timer.tick(time.delta());
277 let dt = time.delta_secs();
278
279 // Rotate the shapes themselves on their own axis
280 for (mut transform, has_wall_shape) in &mut shape_query {
281 transform.rotate_y(dt / 2.);
282 if has_wall_shape {
283 // the wall shape moves up for 4 seconds and then down for 4 seconds.
284 // it oscillates between y = 1.5 and 15.0
285 transform.translation.y = if timer.elapsed_secs() < WALL_SHAPE_TIMER_DURATION_SECS / 2.0
286 {
287 1.5 + 15.0 * timer.elapsed_secs() / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
288 } else {
289 1.5 + 15.0 * (WALL_SHAPE_TIMER_DURATION_SECS - timer.elapsed_secs())
290 / (WALL_SHAPE_TIMER_DURATION_SECS / 2.0)
291 }
292 }
293 }
294
295 // Rotate the ring
296 let transform = &mut ring_query.single_mut()?;
297 transform.rotate_y(dt / 3.);
298
299 Ok(())
300}Sourcepub fn set_duration(&mut self, duration: Duration)
pub fn set_duration(&mut self, duration: Duration)
Sets the duration of the timer.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.set_duration(Duration::from_secs(1));
assert_eq!(timer.duration(), Duration::from_secs(1));Sourcepub fn finish(&mut self)
pub fn finish(&mut self)
Finishes the timer.
§Examples
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.finish();
assert!(timer.is_finished());Sourcepub fn almost_finish(&mut self)
pub fn almost_finish(&mut self)
Almost finishes the timer leaving 1 ns of remaining time. This can be useful when needing an immediate action without having to wait for the set duration of the timer in the first tick.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.almost_finish();
assert!(!timer.is_finished());
assert_eq!(timer.remaining(), Duration::from_nanos(1));Sourcepub fn mode(&self) -> TimerMode
pub fn mode(&self) -> TimerMode
Returns the mode of the timer.
§Examples
let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating);
assert_eq!(timer.mode(), TimerMode::Repeating);Sourcepub fn set_mode(&mut self, mode: TimerMode)
pub fn set_mode(&mut self, mode: TimerMode)
Sets the mode of the timer.
§Examples
let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating);
timer.set_mode(TimerMode::Once);
assert_eq!(timer.mode(), TimerMode::Once);Sourcepub fn tick(&mut self, delta: Duration) -> &Timer
pub fn tick(&mut self, delta: Duration) -> &Timer
Advance the timer by delta seconds.
Non repeating timer will clamp at duration.
Repeating timer will wrap around.
Will not affect paused timers.
See also Stopwatch::tick.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
let mut repeating = Timer::from_seconds(1.0, TimerMode::Repeating);
timer.tick(Duration::from_secs_f32(1.5));
repeating.tick(Duration::from_secs_f32(1.5));
assert_eq!(timer.elapsed_secs(), 1.0);
assert_eq!(repeating.elapsed_secs(), 0.5);Examples found in repository?
More examples
142fn print_light_count(time: Res<Time>, mut timer: Local<PrintingTimer>, lights: Query<&PointLight>) {
143 timer.0.tick(time.delta());
144
145 if timer.0.just_finished() {
146 info!("Lights: {}", lights.iter().len());
147 }
148}
149
150struct LogVisibleLights;
151
152impl Plugin for LogVisibleLights {
153 fn build(&self, app: &mut App) {
154 let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
155 return;
156 };
157
158 render_app.add_systems(
159 Render,
160 print_visible_light_count.in_set(RenderSystems::Prepare),
161 );
162 }
163}
164
165// System for printing the number of meshes on every tick of the timer
166fn print_visible_light_count(
167 time: Res<Time>,
168 mut timer: Local<PrintingTimer>,
169 visible: Query<&ExtractedPointLight>,
170 global_clusterable_object_meta: Res<GlobalClusterableObjectMeta>,
171) {
172 timer.0.tick(time.delta());
173
174 if timer.0.just_finished() {
175 // Note that it's not generally a safe assumption that the number of
176 // lights equals the number of clusterable objects, since some objects
177 // other than lights are clusterable. However, in this specific example,
178 // the only clusterable objects are lights.
179 info!(
180 "Visible Lights: {}, Rendered Lights: {}",
181 visible.iter().len(),
182 global_clusterable_object_meta.entity_to_index.len()
183 );
184 }
185}- examples/time/timers.rs
- examples/showcase/game_menu.rs
- examples/ui/navigation/directional_navigation.rs
- examples/ecs/message.rs
- examples/ui/navigation/directional_navigation_overrides.rs
- examples/stress_tests/many_cubes.rs
- examples/audio/soundtrack.rs
- examples/ui/text/font_atlas_debug.rs
- examples/ecs/state_scoped.rs
- examples/2d/sprite_scale.rs
- examples/2d/sprite_sheet.rs
- examples/2d/tilemap_chunk.rs
- examples/picking/sprite_picking.rs
- examples/stress_tests/many_animated_sprites.rs
- examples/stress_tests/many_animated_sprite_meshes.rs
- examples/shader/array_texture.rs
- examples/animation/animated_mesh_events.rs
- examples/gltf/gltf_extension_animation_graph.rs
- examples/usage/cooldown.rs
- examples/window/custom_cursor_image.rs
- examples/stress_tests/many_text2d.rs
- examples/2d/sprite_animation.rs
- examples/showcase/contributors.rs
- examples/usage/debug_frustum_culling.rs
- examples/showcase/alien_cake_addict.rs
- examples/3d/clustered_decal_maps.rs
Sourcepub fn pause(&mut self)
pub fn pause(&mut self)
Pauses the Timer. Disables the ticking of the timer.
See also Stopwatch::pause.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.pause();
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.elapsed_secs(), 0.0);Examples found in repository?
58fn countdown(time: Res<Time>, mut countdown: ResMut<Countdown>) {
59 countdown.main_timer.tick(time.delta());
60
61 // The API encourages this kind of timer state checking (if you're only checking for one value)
62 // Additionally, `is_finished()` would accomplish the same thing as `just_finished` due to the
63 // timer being repeating, however this makes more sense visually.
64 if countdown.percent_trigger.tick(time.delta()).just_finished() {
65 if !countdown.main_timer.is_finished() {
66 // Print the percent complete the main timer is.
67 info!(
68 "Timer is {:0.0}% complete!",
69 countdown.main_timer.fraction() * 100.0
70 );
71 } else {
72 // The timer has finished so we pause the percent output timer
73 countdown.percent_trigger.pause();
74 info!("Paused percent trigger timer");
75 }
76 }
77}Sourcepub fn unpause(&mut self)
pub fn unpause(&mut self)
Unpauses the Timer. Resumes the ticking of the timer.
See also Stopwatch::unpause().
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.pause();
timer.tick(Duration::from_secs_f32(0.5));
timer.unpause();
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.elapsed_secs(), 0.5);Sourcepub fn is_paused(&self) -> bool
pub fn is_paused(&self) -> bool
Returns true if the timer is paused.
See also Stopwatch::is_paused.
§Examples
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
assert!(!timer.is_paused());
timer.pause();
assert!(timer.is_paused());
timer.unpause();
assert!(!timer.is_paused());Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Resets the timer. The reset doesn’t affect the paused state of the timer.
See also Stopwatch::reset.
Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(1.5));
timer.reset();
assert!(!timer.is_finished());
assert!(!timer.just_finished());
assert_eq!(timer.elapsed_secs(), 0.0);Examples found in repository?
More examples
129fn activate_ability(
130 mut commands: Commands,
131 mut interaction_query: Query<
132 (
133 Entity,
134 &Interaction,
135 &mut Cooldown,
136 &Name,
137 Option<&ActiveCooldown>,
138 ),
139 (Changed<Interaction>, With<Button>),
140 >,
141 mut text: Query<&mut Text>,
142) -> Result {
143 for (entity, interaction, mut cooldown, name, on_cooldown) in &mut interaction_query {
144 if *interaction == Interaction::Pressed {
145 if on_cooldown.is_none() {
146 cooldown.0.reset();
147 commands.entity(entity).insert(ActiveCooldown);
148 **text.single_mut()? = format!("You ate {name}");
149 } else {
150 **text.single_mut()? = format!(
151 "You can eat {name} again in {} seconds.",
152 cooldown.0.remaining_secs().ceil()
153 );
154 }
155 }
156 }
157
158 Ok(())
159}200fn move_player(
201 mut commands: Commands,
202 keyboard_input: Res<ButtonInput<KeyCode>>,
203 mut game: ResMut<Game>,
204 mut transforms: Query<&mut Transform>,
205 time: Res<Time>,
206) {
207 if game.player.move_cooldown.tick(time.delta()).is_finished() {
208 let mut moved = false;
209 let mut rotation = 0.0;
210
211 if keyboard_input.pressed(KeyCode::ArrowUp) {
212 if game.player.i < BOARD_SIZE_I - 1 {
213 game.player.i += 1;
214 }
215 rotation = -PI / 2.;
216 moved = true;
217 }
218 if keyboard_input.pressed(KeyCode::ArrowDown) {
219 if game.player.i > 0 {
220 game.player.i -= 1;
221 }
222 rotation = PI / 2.;
223 moved = true;
224 }
225 if keyboard_input.pressed(KeyCode::ArrowRight) {
226 if game.player.j < BOARD_SIZE_J - 1 {
227 game.player.j += 1;
228 }
229 rotation = PI;
230 moved = true;
231 }
232 if keyboard_input.pressed(KeyCode::ArrowLeft) {
233 if game.player.j > 0 {
234 game.player.j -= 1;
235 }
236 rotation = 0.0;
237 moved = true;
238 }
239
240 // move on the board
241 if moved {
242 game.player.move_cooldown.reset();
243 *transforms.get_mut(game.player.entity.unwrap()).unwrap() = Transform {
244 translation: Vec3::new(
245 game.player.i as f32,
246 game.board[game.player.j][game.player.i].height,
247 game.player.j as f32,
248 ),
249 rotation: Quat::from_rotation_y(rotation),
250 ..default()
251 };
252 }
253 }
254
255 // eat the cake!
256 if let Some(entity) = game.bonus.entity
257 && game.player.i == game.bonus.i
258 && game.player.j == game.bonus.j
259 {
260 game.score += 2;
261 game.cake_eaten += 1;
262 commands.entity(entity).despawn();
263 game.bonus.entity = None;
264 }
265}Sourcepub fn fraction(&self) -> f32
pub fn fraction(&self) -> f32
Returns the fraction of the timer elapsed time (goes from 0.0 to 1.0).
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.fraction(), 0.25);Examples found in repository?
More examples
194fn simulate_particles(
195 mut commands: Commands,
196 mut query: Query<(Entity, &mut Transform, &mut Particle)>,
197 time: Res<Time>,
198) {
199 for (entity, mut transform, mut particle) in &mut query {
200 if particle.lifetime_timer.tick(time.delta()).just_finished() {
201 commands.entity(entity).despawn();
202 return;
203 }
204
205 transform.translation += particle.velocity * time.delta_secs();
206 transform.scale = Vec3::splat(particle.size.lerp(0.0, particle.lifetime_timer.fraction()));
207 particle
208 .velocity
209 .smooth_nudge(&Vec3::ZERO, 4.0, time.delta_secs());
210 }
211}283fn simulate_particles(
284 mut commands: Commands,
285 mut query: Query<(Entity, &mut Transform, &mut Particle)>,
286 time: Res<Time>,
287) {
288 for (entity, mut transform, mut particle) in &mut query {
289 if particle.lifetime_timer.tick(time.delta()).just_finished() {
290 commands.entity(entity).despawn();
291 return;
292 }
293
294 transform.translation += particle.velocity * time.delta_secs();
295 transform.scale = Vec3::splat(particle.size.lerp(0.0, particle.lifetime_timer.fraction()));
296 particle
297 .velocity
298 .smooth_nudge(&Vec3::ZERO, 4.0, time.delta_secs());
299 }
300}161fn animate_cooldowns(
162 time: Res<Time>,
163 mut commands: Commands,
164 buttons: Query<(Entity, &mut Cooldown, &Children), With<ActiveCooldown>>,
165 mut nodes: Query<&mut Node>,
166) -> Result {
167 for (entity, mut timer, children) in buttons {
168 timer.0.tick(time.delta());
169 let cooldown = children.first().ok_or("No child")?;
170 if timer.0.just_finished() {
171 commands.entity(entity).remove::<ActiveCooldown>();
172 nodes.get_mut(*cooldown)?.height = percent(0);
173 } else {
174 nodes.get_mut(*cooldown)?.height = percent((1. - timer.0.fraction()) * 100.);
175 }
176 }
177
178 Ok(())
179}58fn countdown(time: Res<Time>, mut countdown: ResMut<Countdown>) {
59 countdown.main_timer.tick(time.delta());
60
61 // The API encourages this kind of timer state checking (if you're only checking for one value)
62 // Additionally, `is_finished()` would accomplish the same thing as `just_finished` due to the
63 // timer being repeating, however this makes more sense visually.
64 if countdown.percent_trigger.tick(time.delta()).just_finished() {
65 if !countdown.main_timer.is_finished() {
66 // Print the percent complete the main timer is.
67 info!(
68 "Timer is {:0.0}% complete!",
69 countdown.main_timer.fraction() * 100.0
70 );
71 } else {
72 // The timer has finished so we pause the percent output timer
73 countdown.percent_trigger.pause();
74 info!("Paused percent trigger timer");
75 }
76 }
77}345fn animate_decals(
346 mut commands: Commands,
347 mut decals_query: Query<(Entity, &mut ExampleDecal, &mut Transform)>,
348 time: Res<Time>,
349) {
350 for (decal_entity, mut example_decal, mut decal_transform) in decals_query.iter_mut() {
351 // Update the animation timers, and advance the animation state if the
352 // timer has expired.
353 match example_decal.state {
354 ExampleDecalState::AnimatingIn(ref mut timer) => {
355 timer.tick(time.delta());
356 if timer.just_finished() {
357 example_decal.state =
358 ExampleDecalState::Idling(Timer::new(DECAL_IDLE_DURATION, TimerMode::Once));
359 }
360 }
361 ExampleDecalState::Idling(ref mut timer) => {
362 timer.tick(time.delta());
363 if timer.just_finished() {
364 example_decal.state = ExampleDecalState::AnimatingOut(Timer::new(
365 DECAL_ANIMATE_OUT_DURATION,
366 TimerMode::Once,
367 ));
368 }
369 }
370 ExampleDecalState::AnimatingOut(ref mut timer) => {
371 timer.tick(time.delta());
372 if timer.just_finished() {
373 commands.entity(decal_entity).despawn();
374 continue;
375 }
376 }
377 }
378
379 // Actually animate the decal by adjusting its transform.
380 // All we have to do here is to compute the decal's scale as a fraction
381 // of its full size.
382 let new_decal_scale_factor = match example_decal.state {
383 ExampleDecalState::AnimatingIn(ref timer) => timer.fraction(),
384 ExampleDecalState::Idling(_) => 1.0,
385 ExampleDecalState::AnimatingOut(ref timer) => timer.fraction_remaining(),
386 };
387 decal_transform.scale =
388 Vec3::splat(example_decal.size * new_decal_scale_factor).with_z(1.0);
389 }
390}Sourcepub fn fraction_remaining(&self) -> f32
pub fn fraction_remaining(&self) -> f32
Returns the fraction of the timer remaining time (goes from 1.0 to 0.0).
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.fraction_remaining(), 0.75);Examples found in repository?
345fn animate_decals(
346 mut commands: Commands,
347 mut decals_query: Query<(Entity, &mut ExampleDecal, &mut Transform)>,
348 time: Res<Time>,
349) {
350 for (decal_entity, mut example_decal, mut decal_transform) in decals_query.iter_mut() {
351 // Update the animation timers, and advance the animation state if the
352 // timer has expired.
353 match example_decal.state {
354 ExampleDecalState::AnimatingIn(ref mut timer) => {
355 timer.tick(time.delta());
356 if timer.just_finished() {
357 example_decal.state =
358 ExampleDecalState::Idling(Timer::new(DECAL_IDLE_DURATION, TimerMode::Once));
359 }
360 }
361 ExampleDecalState::Idling(ref mut timer) => {
362 timer.tick(time.delta());
363 if timer.just_finished() {
364 example_decal.state = ExampleDecalState::AnimatingOut(Timer::new(
365 DECAL_ANIMATE_OUT_DURATION,
366 TimerMode::Once,
367 ));
368 }
369 }
370 ExampleDecalState::AnimatingOut(ref mut timer) => {
371 timer.tick(time.delta());
372 if timer.just_finished() {
373 commands.entity(decal_entity).despawn();
374 continue;
375 }
376 }
377 }
378
379 // Actually animate the decal by adjusting its transform.
380 // All we have to do here is to compute the decal's scale as a fraction
381 // of its full size.
382 let new_decal_scale_factor = match example_decal.state {
383 ExampleDecalState::AnimatingIn(ref timer) => timer.fraction(),
384 ExampleDecalState::Idling(_) => 1.0,
385 ExampleDecalState::AnimatingOut(ref timer) => timer.fraction_remaining(),
386 };
387 decal_transform.scale =
388 Vec3::splat(example_decal.size * new_decal_scale_factor).with_z(1.0);
389 }
390}Sourcepub fn remaining_secs(&self) -> f32
pub fn remaining_secs(&self) -> f32
Returns the remaining time in seconds
§Examples
use std::cmp::Ordering;
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
let result = timer.remaining_secs().total_cmp(&1.5);
assert_eq!(Ordering::Equal, result);Examples found in repository?
129fn activate_ability(
130 mut commands: Commands,
131 mut interaction_query: Query<
132 (
133 Entity,
134 &Interaction,
135 &mut Cooldown,
136 &Name,
137 Option<&ActiveCooldown>,
138 ),
139 (Changed<Interaction>, With<Button>),
140 >,
141 mut text: Query<&mut Text>,
142) -> Result {
143 for (entity, interaction, mut cooldown, name, on_cooldown) in &mut interaction_query {
144 if *interaction == Interaction::Pressed {
145 if on_cooldown.is_none() {
146 cooldown.0.reset();
147 commands.entity(entity).insert(ActiveCooldown);
148 **text.single_mut()? = format!("You ate {name}");
149 } else {
150 **text.single_mut()? = format!(
151 "You can eat {name} again in {} seconds.",
152 cooldown.0.remaining_secs().ceil()
153 );
154 }
155 }
156 }
157
158 Ok(())
159}Sourcepub fn remaining(&self) -> Duration
pub fn remaining(&self) -> Duration
Returns the remaining time using Duration
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0, TimerMode::Once);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.remaining(), Duration::from_secs_f32(1.5));Sourcepub fn times_finished_this_tick(&self) -> u32
pub fn times_finished_this_tick(&self) -> u32
Returns the number of times a repeating timer
finished during the last tick call.
For non repeating-timers, this method will only ever return 0 or 1.
§Examples
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating);
timer.tick(Duration::from_secs_f32(6.0));
assert_eq!(timer.times_finished_this_tick(), 6);
timer.tick(Duration::from_secs_f32(2.0));
assert_eq!(timer.times_finished_this_tick(), 2);
timer.tick(Duration::from_secs_f32(0.5));
assert_eq!(timer.times_finished_this_tick(), 0);Trait Implementations§
Source§impl<'de> Deserialize<'de> for Timer
impl<'de> Deserialize<'de> for Timer
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Timer, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Timer, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
impl Eq for Timer
Source§impl FromReflect for Timer
impl FromReflect for Timer
Source§fn from_reflect(reflect: &(dyn PartialReflect + 'static)) -> Option<Timer>
fn from_reflect(reflect: &(dyn PartialReflect + 'static)) -> Option<Timer>
Self from a reflected value.Source§fn take_from_reflect(
reflect: Box<dyn PartialReflect>,
) -> Result<Self, Box<dyn PartialReflect>>
fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>
Self using,
constructing the value using from_reflect if that fails. Read moreSource§impl GetTypeRegistration for Timer
impl GetTypeRegistration for Timer
Source§fn get_type_registration() -> TypeRegistration
fn get_type_registration() -> TypeRegistration
TypeRegistration for this type.Source§fn register_type_dependencies(registry: &mut TypeRegistry)
fn register_type_dependencies(registry: &mut TypeRegistry)
Source§impl IntoReturn for Timer
impl IntoReturn for Timer
Source§impl PartialReflect for Timer
impl PartialReflect for Timer
Source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
Source§fn try_apply(
&mut self,
value: &(dyn PartialReflect + 'static),
) -> Result<(), ApplyError>
fn try_apply( &mut self, value: &(dyn PartialReflect + 'static), ) -> Result<(), ApplyError>
Source§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
Source§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
Source§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
Source§fn reflect_owned(self: Box<Timer>) -> ReflectOwned
fn reflect_owned(self: Box<Timer>) -> ReflectOwned
Source§fn try_into_reflect(
self: Box<Timer>,
) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
fn try_into_reflect( self: Box<Timer>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
Source§fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>
fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>
Source§fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>
fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>
Source§fn into_partial_reflect(self: Box<Timer>) -> Box<dyn PartialReflect>
fn into_partial_reflect(self: Box<Timer>) -> Box<dyn PartialReflect>
Source§fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)
fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)
Source§fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)
fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)
Source§fn reflect_partial_eq(
&self,
value: &(dyn PartialReflect + 'static),
) -> Option<bool>
fn reflect_partial_eq( &self, value: &(dyn PartialReflect + 'static), ) -> Option<bool>
Source§fn reflect_partial_cmp(
&self,
value: &(dyn PartialReflect + 'static),
) -> Option<Ordering>
fn reflect_partial_cmp( &self, value: &(dyn PartialReflect + 'static), ) -> Option<Ordering>
Source§fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>
fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>
Self using reflection. Read moreSource§fn apply(&mut self, value: &(dyn PartialReflect + 'static))
fn apply(&mut self, value: &(dyn PartialReflect + 'static))
Source§fn to_dynamic(&self) -> Box<dyn PartialReflect>
fn to_dynamic(&self) -> Box<dyn PartialReflect>
Source§fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
PartialReflect, combines reflect_clone and
take in a useful fashion, automatically constructing an appropriate
ReflectCloneError if the downcast fails.Source§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
Source§fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Source§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
Source§impl Reflect for Timer
impl Reflect for Timer
Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut dyn Any. Read moreSource§fn into_reflect(self: Box<Timer>) -> Box<dyn Reflect>
fn into_reflect(self: Box<Timer>) -> Box<dyn Reflect>
Source§fn as_reflect(&self) -> &(dyn Reflect + 'static)
fn as_reflect(&self) -> &(dyn Reflect + 'static)
Source§fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
Source§impl Serialize for Timer
impl Serialize for Timer
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Source§impl Struct for Timer
impl Struct for Timer
Source§fn field(&self, name: &str) -> Option<&(dyn PartialReflect + 'static)>
fn field(&self, name: &str) -> Option<&(dyn PartialReflect + 'static)>
name as a &dyn PartialReflect.Source§fn field_mut(
&mut self,
name: &str,
) -> Option<&mut (dyn PartialReflect + 'static)>
fn field_mut( &mut self, name: &str, ) -> Option<&mut (dyn PartialReflect + 'static)>
name as a
&mut dyn PartialReflect.Source§fn field_at(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>
fn field_at(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>
index as a
&dyn PartialReflect.Source§fn field_at_mut(
&mut self,
index: usize,
) -> Option<&mut (dyn PartialReflect + 'static)>
fn field_at_mut( &mut self, index: usize, ) -> Option<&mut (dyn PartialReflect + 'static)>
index
as a &mut dyn PartialReflect.Source§fn index_of_name(&self, name: &str) -> Option<usize>
fn index_of_name(&self, name: &str) -> Option<usize>
Source§fn iter_fields(&self) -> FieldIter<'_> ⓘ
fn iter_fields(&self) -> FieldIter<'_> ⓘ
Source§fn to_dynamic_struct(&self) -> DynamicStruct
fn to_dynamic_struct(&self) -> DynamicStruct
DynamicStruct from this struct.Source§fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
None if TypeInfo is not available.impl StructuralPartialEq for Timer
Source§impl TypePath for Timer
impl TypePath for Timer
Source§fn type_path() -> &'static str
fn type_path() -> &'static str
Source§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
Source§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
Source§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
Auto Trait Implementations§
impl Freeze for Timer
impl RefUnwindSafe for Timer
impl Send for Timer
impl Sync for Timer
impl Unpin for Timer
impl UnsafeUnpin for Timer
impl UnwindSafe for Timer
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> Brush for T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ConditionalSend for Twhere
T: Send,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
Source§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path.Source§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
Source§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident.Source§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name.Source§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
Source§impl<T> DynamicTyped for Twhere
T: Typed,
impl<T> DynamicTyped for Twhere
T: Typed,
Source§fn reflect_type_info(&self) -> &'static TypeInfo
fn reflect_type_info(&self) -> &'static TypeInfo
Typed::type_info.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> FromTemplate for T
impl<T> FromTemplate for T
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<S> GetField for Swhere
S: Struct,
impl<S> GetField for Swhere
S: Struct,
Source§impl<T> GetPath for T
impl<T> GetPath for T
Source§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
path. Read moreSource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
path. Read moreSource§fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
path. Read moreSource§fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
path. Read moreSource§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T> HitDataExtra for T
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<G> PatchFromTemplate for Gwhere
G: FromTemplate,
impl<G> PatchFromTemplate for Gwhere
G: FromTemplate,
Source§fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
func, and turns it into a TemplatePatch.Source§impl<T> PatchTemplate for Twhere
T: Template,
impl<T> PatchTemplate for Twhere
T: Template,
Source§fn patch_template<F>(func: F) -> TemplatePatch<F, T>
fn patch_template<F>(func: F) -> TemplatePatch<F, T>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().impl<T> Reflectable for T
Source§impl<T> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
impl<T> Settings for T
Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Source§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T> Template for T
impl<T> Template for T
Source§fn build_template(
&self,
_context: &mut TemplateContext<'_, '_>,
) -> Result<<T as Template>::Output, BevyError>
fn build_template( &self, _context: &mut TemplateContext<'_, '_>, ) -> Result<<T as Template>::Output, BevyError>
entity context to produce a Template::Output.Source§fn clone_template(&self) -> T
fn clone_template(&self) -> T
Clone.