pub trait System:
Send
+ Sync
+ 'static {
type In: SystemInput;
type Out;
Show 19 methods
// Required methods
fn name(&self) -> Cow<'static, str>;
fn component_access(&self) -> &Access<ComponentId>;
fn archetype_component_access(&self) -> &Access<ArchetypeComponentId>;
fn is_send(&self) -> bool;
fn is_exclusive(&self) -> bool;
fn has_deferred(&self) -> bool;
unsafe fn run_unsafe(
&mut self,
input: SystemIn<'_, Self>,
world: UnsafeWorldCell<'_>,
) -> Self::Out;
fn apply_deferred(&mut self, world: &mut World);
fn queue_deferred(&mut self, world: DeferredWorld<'_>);
unsafe fn validate_param_unsafe(
&mut self,
world: UnsafeWorldCell<'_>,
) -> bool;
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 type_id(&self) -> TypeId { ... }
fn run(&mut self, input: SystemIn<'_, Self>, world: &mut World) -> Self::Out { ... }
fn validate_param(&mut self, world: &World) -> bool { ... }
fn default_system_sets(&self) -> Vec<InternedSystemSet> { ... }
}
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§
Sourcetype In: SystemInput
type In: SystemInput
The system’s input.
Required Methods§
Sourcefn component_access(&self) -> &Access<ComponentId>
fn component_access(&self) -> &Access<ComponentId>
Returns the system’s component Access
.
Sourcefn archetype_component_access(&self) -> &Access<ArchetypeComponentId>
fn archetype_component_access(&self) -> &Access<ArchetypeComponentId>
Returns the system’s archetype component Access
.
Sourcefn is_exclusive(&self) -> bool
fn is_exclusive(&self) -> bool
Returns true if the system must be run exclusively.
Sourcefn has_deferred(&self) -> bool
fn has_deferred(&self) -> bool
Returns true if system has deferred buffers.
Sourceunsafe fn run_unsafe(
&mut self,
input: SystemIn<'_, Self>,
world: UnsafeWorldCell<'_>,
) -> Self::Out
unsafe fn run_unsafe( &mut self, input: SystemIn<'_, Self>, 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.
Unlike System::run
, this will not apply deferred parameters, which must be independently
applied by calling System::apply_deferred
at later point in time.
§Safety
- The caller must ensure that
world
has permission to access any world data registered inarchetype_component_access
. There must be no conflicting simultaneous accesses while the system is running. - The method
System::update_archetype_component_access
must be called at some point before this one, with the same exactWorld
. IfSystem::update_archetype_component_access
panics (or otherwise does not return for any reason), this method must not be called.
Sourcefn apply_deferred(&mut self, world: &mut World)
fn apply_deferred(&mut self, world: &mut World)
Sourcefn queue_deferred(&mut self, world: DeferredWorld<'_>)
fn queue_deferred(&mut self, world: DeferredWorld<'_>)
Enqueues any Deferred
system parameters (or other system buffers)
of this system into the world’s command buffer.
Sourceunsafe fn validate_param_unsafe(&mut self, world: UnsafeWorldCell<'_>) -> bool
unsafe fn validate_param_unsafe(&mut self, world: UnsafeWorldCell<'_>) -> bool
Validates that all parameters can be acquired and that system can run without panic. Built-in executors use this to prevent invalid systems from running.
However calling and respecting System::validate_param_unsafe
or it’s safe variant
is not a strict requirement, both System::run
and System::run_unsafe
should provide their own safety mechanism to prevent undefined behavior.
This method has to be called directly before System::run_unsafe
with no other (relevant)
world mutations in between. Otherwise, while it won’t lead to any undefined behavior,
the validity of the param may change.
§Safety
- The caller must ensure that
world
has permission to access any world data registered inarchetype_component_access
. There must be no conflicting simultaneous accesses while the system is running. - The method
System::update_archetype_component_access
must be called at some point before this one, with the same exactWorld
. IfSystem::update_archetype_component_access
panics (or otherwise does not return for any reason), this method must not be called.
Sourcefn initialize(&mut self, _world: &mut World)
fn initialize(&mut self, _world: &mut World)
Initialize the system.
Sourcefn update_archetype_component_access(&mut self, world: UnsafeWorldCell<'_>)
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
.
Sourcefn check_change_tick(&mut self, change_tick: Tick)
fn check_change_tick(&mut self, change_tick: Tick)
Checks any Tick
s 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.
Sourcefn get_last_run(&self) -> Tick
fn get_last_run(&self) -> Tick
Gets the tick indicating the last time this system ran.
Sourcefn set_last_run(&mut self, last_run: Tick)
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§
Sourcefn run(&mut self, input: SystemIn<'_, Self>, world: &mut World) -> Self::Out
fn run(&mut self, input: SystemIn<'_, Self>, 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
.
Unlike System::run_unsafe
, this will apply deferred parameters immediately.
Sourcefn validate_param(&mut self, world: &World) -> bool
fn validate_param(&mut self, world: &World) -> bool
Safe version of System::validate_param_unsafe
.
that runs on exclusive, single-threaded world
pointer.
Sourcefn default_system_sets(&self) -> Vec<InternedSystemSet>
fn default_system_sets(&self) -> Vec<InternedSystemSet>
Returns the system’s default system sets.
Each system will create a default system set that contains the system.