Skip to main content

SystemState

Struct SystemState 

Source
pub struct SystemState<Param>
where Param: SystemParam + 'static,
{ /* private fields */ }
Expand description

Holds on to persistent state required to drive SystemParam for a System.

This is a very powerful and convenient tool for working with exclusive world access, allowing you to fetch data from the World as if you were running a System.

Borrow-checking is handled for you, allowing you to mutably access multiple compatible system parameters at once, and arbitrary system parameters (like EventWriter) can be conveniently fetched.

For an alternative approach to split mutable access to the world, see World::resource_scope.

§Warning

SystemState values created can be cached to improve performance, and must be cached and reused in order for system parameters that rely on local state to work correctly. These include:

§Example

Basic usage:

use bevy_ecs::prelude::*;
use bevy_ecs::{system::SystemState};
use bevy_ecs::event::Events;

struct MyEvent;
#[derive(Resource)]
struct MyResource(u32);

#[derive(Component)]
struct MyComponent;

// Work directly on the `World`
let mut world = World::new();
world.init_resource::<Events<MyEvent>>();

// Construct a `SystemState` struct, passing in a tuple of `SystemParam`
// as if you were writing an ordinary system.
let mut system_state: SystemState<(
    EventWriter<MyEvent>,
    Option<ResMut<MyResource>>,
    Query<&MyComponent>,
    )> = SystemState::new(&mut world);

// Use system_state.get_mut(&mut world) and unpack your system parameters into variables!
// system_state.get(&world) provides read-only versions of your system parameters instead.
let (event_writer, maybe_resource, query) = system_state.get_mut(&mut world);

Caching:

use bevy_ecs::prelude::*;
use bevy_ecs::{system::SystemState};
use bevy_ecs::event::Events;

struct MyEvent;
#[derive(Resource)]
struct CachedSystemState {
   event_state: SystemState<EventReader<'static, 'static, MyEvent>>
}

// Create and store a system state once
let mut world = World::new();
world.init_resource::<Events<MyEvent>>();
let initial_state: SystemState<EventReader<MyEvent>>  = SystemState::new(&mut world);

// The system state is cached in a resource
world.insert_resource(CachedSystemState{event_state: initial_state});

// Later, fetch the cached system state, saving on overhead
world.resource_scope(|world, mut cached_state: Mut<CachedSystemState>| {
    let mut event_reader = cached_state.event_state.get_mut(world);

    for events in event_reader.iter() {
        println!("Hello World!");
    };
});

Implementations§

Source§

impl<Param> SystemState<Param>
where Param: SystemParam,

Source

pub fn new(world: &mut World) -> SystemState<Param>

Source

pub fn meta(&self) -> &SystemMeta

Source

pub fn get<'w, 's>( &'s mut self, world: &'w World, ) -> <<Param as SystemParam>::Fetch as SystemParamFetch<'w, 's>>::Item

Retrieve the SystemParam values. This can only be called when all parameters are read-only.

Source

pub fn get_mut<'w, 's>( &'s mut self, world: &'w mut World, ) -> <<Param as SystemParam>::Fetch as SystemParamFetch<'w, 's>>::Item

Retrieve the mutable SystemParam values.

Source

pub fn apply(&mut self, world: &mut World)

Applies all state queued up for SystemParam values. For example, this will apply commands queued up by a Commands parameter to the given World. This function should be called manually after the values returned by SystemState::get and SystemState::get_mut are finished being used.

Source

pub fn matches_world(&self, world: &World) -> bool

Source

pub unsafe fn get_unchecked_manual<'w, 's>( &'s mut self, world: &'w World, ) -> <<Param as SystemParam>::Fetch as SystemParamFetch<'w, 's>>::Item

Retrieve the SystemParam values. This will not update archetypes automatically.

§Safety

This call might access any of the input parameters in a way that violates Rust’s mutability rules. Make sure the data access is safe in the context of global World access. The passed-in World must be the World the SystemState was created with.

Trait Implementations§

Source§

impl<'a, P> ExclusiveSystemParam for &'a mut SystemState<P>
where P: SystemParam + 'static,

Source§

impl<'s, P> ExclusiveSystemParamFetch<'s> for SystemState<P>
where P: SystemParam + 'static,

Source§

type Item = &'s mut SystemState<P>

Source§

fn get_param( state: &'s mut SystemState<P>, _system_meta: &SystemMeta, ) -> <SystemState<P> as ExclusiveSystemParamFetch<'s>>::Item

Source§

impl<P> ExclusiveSystemParamState for SystemState<P>
where P: SystemParam,

Source§

fn init(world: &mut World, _system_meta: &mut SystemMeta) -> SystemState<P>

Source§

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

Source§

impl<Param> FromWorld for SystemState<Param>
where Param: SystemParam,

Source§

fn from_world(world: &mut World) -> SystemState<Param>

Creates Self using data from the given World

Auto Trait Implementations§

§

impl<Param> Freeze for SystemState<Param>
where <Param as SystemParam>::Fetch: Freeze,

§

impl<Param> RefUnwindSafe for SystemState<Param>
where <Param as SystemParam>::Fetch: RefUnwindSafe,

§

impl<Param> Send for SystemState<Param>

§

impl<Param> Sync for SystemState<Param>

§

impl<Param> Unpin for SystemState<Param>
where <Param as SystemParam>::Fetch: Unpin,

§

impl<Param> UnsafeUnpin for SystemState<Param>
where <Param as SystemParam>::Fetch: UnsafeUnpin,

§

impl<Param> UnwindSafe for SystemState<Param>
where <Param as SystemParam>::Fetch: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> Event for T
where T: Send + Sync + 'static,