diff --git a/crates/bevy_input/src/gamepad.rs b/crates/bevy_input/src/gamepad.rs index 521dea4653..c4f1ea22da 100644 --- a/crates/bevy_input/src/gamepad.rs +++ b/crates/bevy_input/src/gamepad.rs @@ -1,6 +1,9 @@ use crate::{Axis, Input}; use bevy_ecs::event::{EventReader, EventWriter}; -use bevy_ecs::system::{Res, ResMut, Resource}; +use bevy_ecs::{ + change_detection::DetectChanges, + system::{Res, ResMut, Resource}, +}; use bevy_reflect::{std_traits::ReflectDefault, FromReflect, Reflect}; use bevy_utils::{tracing::info, HashMap}; use thiserror::Error; @@ -1160,7 +1163,7 @@ pub fn gamepad_event_system( mut events: EventWriter, settings: Res, ) { - button_input.clear(); + button_input.bypass_change_detection().clear(); for event in raw_events.iter() { match &event.event_type { GamepadEventType::Connected(_) => { diff --git a/crates/bevy_input/src/input.rs b/crates/bevy_input/src/input.rs index 8e4556f9ae..3d1a1ecf5a 100644 --- a/crates/bevy_input/src/input.rs +++ b/crates/bevy_input/src/input.rs @@ -34,6 +34,13 @@ use bevy_ecs::schedule::State; /// * Call the [`Input::press`] method for each press event. /// * Call the [`Input::release`] method for each release event. /// * Call the [`Input::clear`] method at each frame start, before processing events. +/// +/// Note: Calling `clear` from a [`ResMut`] will trigger change detection. +/// It may be preferable to use [`DetectChanges::bypass_change_detection`] +/// to avoid causing the resource to always be marked as changed. +/// +///[`ResMut`]: bevy_ecs::system::ResMut +///[`DetectChanges::bypass_change_detection`]: bevy_ecs::change_detection::DetectChanges::bypass_change_detection #[derive(Debug, Clone, Resource, Reflect)] #[reflect(Default)] pub struct Input { diff --git a/crates/bevy_input/src/keyboard.rs b/crates/bevy_input/src/keyboard.rs index e2d174b6a5..021646015b 100644 --- a/crates/bevy_input/src/keyboard.rs +++ b/crates/bevy_input/src/keyboard.rs @@ -1,5 +1,5 @@ use crate::{ButtonState, Input}; -use bevy_ecs::{event::EventReader, system::ResMut}; +use bevy_ecs::{change_detection::DetectChanges, event::EventReader, system::ResMut}; use bevy_reflect::{FromReflect, Reflect}; #[cfg(feature = "serialize")] @@ -41,8 +41,9 @@ pub fn keyboard_input_system( mut key_input: ResMut>, mut keyboard_input_events: EventReader, ) { - scan_input.clear(); - key_input.clear(); + // Avoid clearing if it's not empty to ensure change detection is not triggered. + scan_input.bypass_change_detection().clear(); + key_input.bypass_change_detection().clear(); for event in keyboard_input_events.iter() { let KeyboardInput { scan_code, state, .. diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index 50d92e52c0..bf86ed55b2 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -1,5 +1,5 @@ use crate::{ButtonState, Input}; -use bevy_ecs::{event::EventReader, system::ResMut}; +use bevy_ecs::{change_detection::DetectChanges, event::EventReader, system::ResMut}; use bevy_math::Vec2; use bevy_reflect::{FromReflect, Reflect}; @@ -132,7 +132,7 @@ pub fn mouse_button_input_system( mut mouse_button_input: ResMut>, mut mouse_button_input_events: EventReader, ) { - mouse_button_input.clear(); + mouse_button_input.bypass_change_detection().clear(); for event in mouse_button_input_events.iter() { match event.state { ButtonState::Pressed => mouse_button_input.press(event.button),