pub fn input_toggle_active<T>(
    default: bool,
    input: T
) -> impl FnMut(Res<'_, ButtonInput<T>>) -> bool + Clone
where T: Copy + Eq + Hash + Send + Sync + 'static,
Expand description

Stateful run condition that can be toggled via a input press using ButtonInput::just_pressed.


fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Update, pause_menu.run_if(input_toggle_active(false, KeyCode::Escape)))
        .run();
}

fn pause_menu() {
    println!("in pause menu");
}

If you want other systems to be able to access whether the toggled state is active, you should use a custom resource or a state for that:


#[derive(Resource, Default)]
struct Paused(bool);

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .init_resource::<Paused>()
        .add_systems(Update, toggle_pause_state.run_if(input_just_pressed(KeyCode::Escape)))
        .add_systems(Update, pause_menu.run_if(|paused: Res<Paused>| paused.0))
        .run();
}

fn toggle_pause_state(mut paused: ResMut<Paused>) {
    paused.0 = !paused.0;
}

fn pause_menu() {
    println!("in pause menu");
}