Trait bevy::ecs::system::System

pub trait System: Send + Sync + 'static {
    type In;
    type Out;

Show 15 methods // Required methods fn name(&self) -> Cow<'static, str>; fn type_id(&self) -> TypeId; fn component_access(&self) -> &Access<ComponentId>; fn archetype_component_access(&self) -> &Access<ArchetypeComponentId>; fn is_send(&self) -> bool; fn is_exclusive(&self) -> bool; unsafe fn run_unsafe( &mut self, input: Self::In, world: UnsafeWorldCell<'_> ) -> Self::Out; fn apply_deferred(&mut self, world: &mut World); fn initialize(&mut self, _world: &mut World); fn update_archetype_component_access(&mut self, world: UnsafeWorldCell<'_>); fn check_change_tick(&mut self, change_tick: Tick); fn get_last_run(&self) -> Tick; fn set_last_run(&mut self, last_run: Tick); // Provided methods fn run(&mut self, input: Self::In, world: &mut World) -> Self::Out { ... } fn default_system_sets(&self) -> Vec<Box<dyn SystemSet, Global>, Global> { ... }
}
Expand description

An ECS system that can be added to a Schedule

Systems are functions with all arguments implementing SystemParam.

Systems are added to an application using App::add_systems(Update, my_system) or similar methods, and will generally run once per pass of the main loop.

Systems are executed in parallel, in opportunistic order; data access is managed automatically. It’s possible to specify explicit execution order between specific systems, see IntoSystemConfigs.

Required Associated Types§

type In

The system’s input. See In for FunctionSystems.

type Out

The system’s output.

Required Methods§

fn name(&self) -> Cow<'static, str>

Returns the system’s name.

fn type_id(&self) -> TypeId

Returns the TypeId of the underlying system type.

fn component_access(&self) -> &Access<ComponentId>

Returns the system’s component Access.

fn archetype_component_access(&self) -> &Access<ArchetypeComponentId>

Returns the system’s archetype component Access.

fn is_send(&self) -> bool

Returns true if the system is Send.

fn is_exclusive(&self) -> bool

Returns true if the system must be run exclusively.

unsafe fn run_unsafe( &mut self, input: Self::In, world: UnsafeWorldCell<'_> ) -> Self::Out

Runs the system with the given input in the world. Unlike System::run, this function can be called in parallel with other systems and may break Rust’s aliasing rules if used incorrectly, making it unsafe to call.

Safety
  • The caller must ensure that world has permission to access any world data registered in Self::archetype_component_access. There must be no conflicting simultaneous accesses while the system is running.
  • The method Self::update_archetype_component_access must be called at some point before this one, with the same exact World. If update_archetype_component_access panics (or otherwise does not return for any reason), this method must not be called.

fn apply_deferred(&mut self, world: &mut World)

Applies any Deferred system parameters (or other system buffers) of this system to the world.

This is where Commands get applied.

fn initialize(&mut self, _world: &mut World)

Initialize the system.

fn update_archetype_component_access(&mut self, world: UnsafeWorldCell<'_>)

Update the system’s archetype component Access.

Note for implementors

world may only be used to access metadata. This can be done in safe code via functions such as UnsafeWorldCell::archetypes.

fn check_change_tick(&mut self, change_tick: Tick)

Checks any Ticks stored on this system and wraps their value if they get too old.

This method must be called periodically to ensure that change detection behaves correctly. When using bevy’s default configuration, this will be called for you as needed.

fn get_last_run(&self) -> Tick

Gets the tick indicating the last time this system ran.

fn set_last_run(&mut self, last_run: Tick)

Overwrites the tick indicating the last time this system ran.

Warning

This is a complex and error-prone operation, that can have unexpected consequences on any system relying on this code. However, it can be an essential escape hatch when, for example, you are trying to synchronize representations using change detection and need to avoid infinite recursion.

Provided Methods§

fn run(&mut self, input: Self::In, world: &mut World) -> Self::Out

Runs the system with the given input in the world.

For read-only systems, see run_readonly, which can be called using &World.

fn default_system_sets(&self) -> Vec<Box<dyn SystemSet, Global>, Global>

Returns the system’s default system sets.

Trait Implementations§

§

impl Debug for dyn System<Out = (), In = ()>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl IntoSystemConfigs<()> for Box<dyn System<Out = (), In = ()>, Global>

§

fn in_set(self, set: impl SystemSet) -> SystemConfigs

Add these systems to the provided set.
§

fn before<M>(self, set: impl IntoSystemSet<M>) -> SystemConfigs

Run before all systems in set.
§

fn after<M>(self, set: impl IntoSystemSet<M>) -> SystemConfigs

Run after all systems in set.
§

fn distributive_run_if<M>( self, condition: impl Condition<M, ()> + Clone ) -> SystemConfigs

Add a run condition to each contained system. Read more
§

fn run_if<M>(self, condition: impl Condition<M, ()>) -> SystemConfigs

Run the systems only if the Condition is true. Read more
§

fn ambiguous_with<M>(self, set: impl IntoSystemSet<M>) -> SystemConfigs

Suppress warnings and errors that would result from these systems having ambiguities (conflicting access but indeterminate order) with systems in set.
§

fn ambiguous_with_all(self) -> SystemConfigs

Suppress warnings and errors that would result from these systems having ambiguities (conflicting access but indeterminate order) with any other system.
§

fn chain(self) -> SystemConfigs

Treat this collection as a sequence of systems. Read more
§

fn on_startup(self) -> SystemConfigs

👎Deprecated since 0.11.0: app.add_system(foo.on_startup()) has been deprecated in favor of app.add_systems(Startup, foo). Please migrate to that API.
This used to add the system to CoreSchedule::Startup. This was a shorthand for self.in_schedule(CoreSchedule::Startup). Read more
§

fn in_schedule(self, _schedule: impl ScheduleLabel) -> SystemConfigs

👎Deprecated since 0.11.0: app.add_system(foo.in_schedule(SomeSchedule)) has been deprecated in favor of app.add_systems(SomeSchedule, foo). Please migrate to that API.
This used to add the system to the provided schedule. Read more

Implementors§

§

impl<A, B, Func> System for CombinatorSystem<Func, A, B>where Func: Combine<A, B> + 'static, A: System, B: System,

§

type In = <Func as Combine<A, B>>::In

§

type Out = <Func as Combine<A, B>>::Out

§

impl<Marker, F> System for ExclusiveFunctionSystem<Marker, F>where Marker: 'static, F: ExclusiveSystemParamFunction<Marker>,

§

type In = <F as ExclusiveSystemParamFunction<Marker>>::In

§

type Out = <F as ExclusiveSystemParamFunction<Marker>>::Out

§

impl<Marker, F> System for FunctionSystem<Marker, F>where Marker: 'static, F: SystemParamFunction<Marker>,

§

type In = <F as SystemParamFunction<Marker>>::In

§

type Out = <F as SystemParamFunction<Marker>>::Out

§

impl<T> System for NotSystem<T>where T: System, <T as System>::Out: Not,

§

type In = <T as System>::In

§

type Out = <<T as System>::Out as Not>::Output