diff --git a/crates/bevy_ecs/src/schedule/state.rs b/crates/bevy_ecs/src/schedule/state.rs index 7bb65621e06bb..763198aa0f8e7 100644 --- a/crates/bevy_ecs/src/schedule/state.rs +++ b/crates/bevy_ecs/src/schedule/state.rs @@ -129,16 +129,18 @@ pub fn apply_state_transition(world: &mut World) { if let Some(entered) = next_state_resource.bypass_change_detection().0.take() { next_state_resource.set_changed(); - let exited = mem::replace(&mut world.resource_mut::>().0, entered.clone()); - - // Try to run the schedules if they exist. - world.try_run_schedule(OnExit(exited.clone())).ok(); - world - .try_run_schedule(OnTransition { - from: exited, - to: entered.clone(), - }) - .ok(); - world.try_run_schedule(OnEnter(entered)).ok(); + let mut state_resource = world.resource_mut::>(); + if *state_resource != entered { + let exited = mem::replace(&mut state_resource.0, entered.clone()); + // Try to run the schedules if they exist. + world.try_run_schedule(OnExit(exited.clone())).ok(); + world + .try_run_schedule(OnTransition { + from: exited, + to: entered.clone(), + }) + .ok(); + world.try_run_schedule(OnEnter(entered)).ok(); + } } }