#timer #bevy #observer

bevy_mod_observable_timer

An observer-based timer for bevy

4 releases (2 breaking)

Uses new Rust 2024

new 0.3.0 Apr 24, 2025
0.2.0 Apr 23, 2025
0.1.1 Oct 23, 2024
0.1.0 Oct 22, 2024

#495 in Game dev

Download history 3/week @ 2025-01-31 2/week @ 2025-02-07 1/week @ 2025-02-21 5/week @ 2025-02-28 59/week @ 2025-04-18

59 downloads per month

MIT/Apache

20KB
125 lines

bevy_mod_observable_timer

License Crates.io Downloads Docs

This crate provides an observer-based timer system for bevy entities. Any entity may have an ObservableTimer component attached to it, which will produce observable lifetime cycle triggers.

  • TimerStarted is triggered immediately after inserting a new ObservableTimer (including when overwriting an old one).
  • TimerFinished is triggered after each elapsed interval.
  • TimerStopped is triggered when the ObservableTimer component is removed/despawned.

When a timer finishes it will automatically perform some behavior. By default this is despawning its attached entity. See TimerFinishBehavior for more information.

Basic Example

use bevy::{log::LogPlugin, prelude::*};
use bevy_mod_observable_timer::*;

fn main() {
    App::new()
        .add_plugins((
            MinimalPlugins,
            LogPlugin::default(),
            ObservableTimerPlugin::default(),
        ))
        .add_systems(Startup, startup)
        .run();
}

fn startup(mut commands: Commands) {
    commands
        .spawn(ObservableTimer::from_seconds(1.0, TimerMode::Repeating))
        .observe(|_: Trigger<TimerStarted>| {
            info!("Timer started");
        })
        .observe(
            |trigger: Trigger<TimerFinished>, mut count: Local<usize>, mut commands: Commands| {
                *count += 1;
                info!("Timer finished (#{})", *count);

                if *count == 5 {
                    commands.entity(trigger.target()).despawn();
                }
            },
        )
        .observe(
            |_: Trigger<TimerStopped>, mut app_exit: EventWriter<AppExit>| {
                info!("Timer stopped");
                app_exit.write_default();
            },
        );
}

Output:

Timer started
Timer finished (#1)
Timer finished (#2)
Timer finished (#3)
Timer finished (#4)
Timer finished (#5)
Timer stopped

Compatibility

bevy bevy_mod_observable_timer
0.16 0.3
0.15 0.2
0.14 0.1

License

Except where noted, all code in this repository is dual-licensed under either:

at your option.

Dependencies

~24MB
~412K SLoC