Skip to main content

custom_executor/
custom_executor.rs

1//! Demonstrates how to make a custom [`SystemExecutor`].
2
3use bevy::{
4    ecs::{
5        error::{BevyError, ErrorContext},
6        schedule::{FixedBitSet, SystemExecutor, SystemSchedule},
7    },
8    prelude::*,
9};
10
11#[derive(Default)]
12struct CustomExecutor;
13
14impl SystemExecutor for CustomExecutor {
15    fn init(&mut self, _schedule: &SystemSchedule) {}
16
17    fn run(
18        &mut self,
19        schedule: &mut SystemSchedule,
20        world: &mut World,
21        _skip_systems: Option<&FixedBitSet>,
22        _error_handler: fn(BevyError, ErrorContext),
23    ) {
24        #[expect(unsafe_code, reason = "CustomExecutor's require unsafe")]
25        // SAFETY: `run` is a trait method on `System`
26        for entry in unsafe { schedule.systems_mut().iter_mut() } {
27            let _ = entry.run((), world);
28        }
29    }
30
31    fn set_apply_final_deferred(&mut self, _value: bool) {}
32}
33
34#[derive(Resource, Default)]
35struct Counter(u32);
36
37fn increment(mut counter: ResMut<Counter>) {
38    counter.0 += 1;
39}
40
41fn print_counter(counter: Res<Counter>) {
42    println!("Counter: {}", counter.0);
43}
44
45fn main() {
46    let mut world = World::new();
47    world.init_resource::<Counter>();
48
49    let mut schedule = Schedule::default();
50    schedule.set_executor(CustomExecutor);
51    schedule.add_systems((increment, print_counter).chain());
52
53    for _ in 0..5 {
54        schedule.run(&mut world);
55    }
56}