pub struct Commands<'w, 's> { /* private fields */ }
Expand description
A queue of commands that get executed at the end of the stage of the system that called them.
Commands are executed one at a time in an exclusive fashion.
Each command can be used to modify the World
in arbitrary ways:
- spawning or despawning entities
- inserting components on new or existing entities
- inserting resources
- etc.
Usage
Add mut commands: Commands
as a function argument to your system to get a copy of this struct that will be applied at the end of the current stage.
Commands are almost always used as a SystemParam
.
fn my_system(mut commands: Commands) {
// ...
}
Implementing
Each built-in command is implemented as a separate method, e.g. spawn
.
In addition to the pre-defined command methods, you can add commands with any arbitrary
behavior using Commands::add
, which accepts any type implementing Command
.
Since closures and other functions implement this trait automatically, this allows one-shot, anonymous custom commands.
// NOTE: type inference fails here, so annotations are required on the closure.
commands.add(|w: &mut World| {
// Mutate the world however you want...
});
Implementations
impl<'w, 's> Commands<'w, 's>
impl<'w, 's> Commands<'w, 's>
pub fn new(queue: &'s mut CommandQueue, world: &'w World) -> Commands<'w, 's>
pub fn new(queue: &'s mut CommandQueue, world: &'w World) -> Commands<'w, 's>
Create a new Commands
from a queue and a world.
pub fn new_from_entities(
queue: &'s mut CommandQueue,
entities: &'w Entities
) -> Commands<'w, 's>
pub fn new_from_entities(
queue: &'s mut CommandQueue,
entities: &'w Entities
) -> Commands<'w, 's>
Create a new Commands
from a queue and an Entities
reference.
pub fn spawn(&'a mut self) -> EntityCommands<'w, 's, 'a>
pub fn spawn(&'a mut self) -> EntityCommands<'w, 's, 'a>
Creates a new empty Entity
and returns an EntityCommands
builder for it.
To directly spawn an entity with a Bundle
included, you can use
spawn_bundle
instead of .spawn().insert_bundle()
.
See World::spawn
for more details.
Example
#[derive(Component)]
struct Label(&'static str);
#[derive(Component)]
struct Strength(u32);
#[derive(Component)]
struct Agility(u32);
fn example_system(mut commands: Commands) {
// Create a new empty entity and retrieve its id.
let empty_entity = commands.spawn().id();
// Create another empty entity, then add some component to it
commands.spawn()
// adds a new component bundle to the entity
.insert_bundle((Strength(1), Agility(2)))
// adds a single component to the entity
.insert(Label("hello world"));
}
pub fn get_or_spawn(&'a mut self, entity: Entity) -> EntityCommands<'w, 's, 'a>
pub fn get_or_spawn(&'a mut self, entity: Entity) -> EntityCommands<'w, 's, 'a>
Returns an EntityCommands
for the given entity
(if it exists) or spawns one if it
doesn’t exist. This will return None
if the entity
exists with a different generation.
Note
Spawning a specific entity
value is rarely the right choice. Most apps should favor
Commands::spawn
. This method should generally only be used for sharing entities across
apps, and only when they have a scheme worked out to share an ID space (which doesn’t happen
by default).
pub fn spawn_bundle<T>(&'a mut self, bundle: T) -> EntityCommands<'w, 's, 'a> where
T: Bundle,
pub fn spawn_bundle<T>(&'a mut self, bundle: T) -> EntityCommands<'w, 's, 'a> where
T: Bundle,
Creates a new entity with the components contained in bundle
.
This returns an EntityCommands
builder, which enables inserting more components and
bundles using a “builder pattern”.
Note that bundle
is a Bundle
, which is a collection of components. Bundle
is
automatically implemented for tuples of components. You can also create your own bundle
types by deriving Bundle
.
Example
use bevy_ecs::prelude::*;
#[derive(Component)]
struct Component1;
#[derive(Component)]
struct Component2;
#[derive(Component)]
struct Label(&'static str);
#[derive(Component)]
struct Strength(u32);
#[derive(Component)]
struct Agility(u32);
#[derive(Bundle)]
struct ExampleBundle {
a: Component1,
b: Component2,
}
fn example_system(mut commands: Commands) {
// Create a new entity with a component bundle.
commands.spawn_bundle(ExampleBundle {
a: Component1,
b: Component2,
});
commands
// Create a new entity with two components using a "tuple bundle".
.spawn_bundle((Component1, Component2))
// spawn_bundle returns a builder, so you can insert more bundles like this:
.insert_bundle((Strength(1), Agility(2)))
// or insert single components like this:
.insert(Label("hello world"));
}
pub fn entity(&'a mut self, entity: Entity) -> EntityCommands<'w, 's, 'a>
pub fn entity(&'a mut self, entity: Entity) -> EntityCommands<'w, 's, 'a>
Returns an EntityCommands
builder for the requested Entity
.
Example
use bevy_ecs::prelude::*;
#[derive(Component)]
struct Label(&'static str);
#[derive(Component)]
struct Strength(u32);
#[derive(Component)]
struct Agility(u32);
fn example_system(mut commands: Commands) {
// Create a new, empty entity
let entity = commands.spawn().id();
commands.entity(entity)
// adds a new component bundle to the entity
.insert_bundle((Strength(1), Agility(2)))
// adds a single component to the entity
.insert(Label("hello world"));
}
pub fn spawn_batch<I>(&mut self, bundles_iter: I) where
I: 'static + IntoIterator + Send + Sync,
<I as IntoIterator>::Item: Bundle,
pub fn spawn_batch<I>(&mut self, bundles_iter: I) where
I: 'static + IntoIterator + Send + Sync,
<I as IntoIterator>::Item: Bundle,
Spawns entities to the World
according to the given iterator (or a type that can
be converted to it).
The end result of this command is equivalent to iterating bundles_iter
and calling
spawn
on each bundle, but it is more performant due to memory
pre-allocation.
Example
commands.spawn_batch(vec![
(
Name("Alice".to_string()),
Score(0),
),
(
Name("Bob".to_string()),
Score(0),
),
]);
pub fn insert_or_spawn_batch<I, B>(&mut self, bundles_iter: I) where
I: 'static + IntoIterator + Send + Sync,
B: Bundle,
<I as IntoIterator>::IntoIter: Iterator,
<<I as IntoIterator>::IntoIter as Iterator>::Item == (Entity, B),
pub fn insert_or_spawn_batch<I, B>(&mut self, bundles_iter: I) where
I: 'static + IntoIterator + Send + Sync,
B: Bundle,
<I as IntoIterator>::IntoIter: Iterator,
<<I as IntoIterator>::IntoIter as Iterator>::Item == (Entity, B),
For a given batch of (Entity, Bundle) pairs, either spawns each Entity with the given bundle (if the entity does not exist), or inserts the Bundle (if the entity already exists).
This is faster than doing equivalent operations one-by-one.
Note
Spawning a specific entity
value is rarely the right choice. Most apps should use Commands::spawn_batch
.
This method should generally only be used for sharing entities across apps, and only when they have a scheme
worked out to share an ID space (which doesn’t happen by default).
pub fn init_resource<R>(&mut self) where
R: Resource + FromWorld,
pub fn init_resource<R>(&mut self) where
R: Resource + FromWorld,
Inserts a resource with standard starting values to the World
.
If the resource already exists, nothing happens.
The value given by the FromWorld::from_world
method will be used.
Note that any resource with the Default
trait automatically implements FromWorld
,
and those default values will be here instead.
See World::init_resource
for more details.
Note that commands do not take effect immediately.
When possible, prefer the equivalent methods on App
or World
.
Example
commands.init_resource::<Scoreboard>();
pub fn insert_resource<R>(&mut self, resource: R) where
R: Resource,
pub fn insert_resource<R>(&mut self, resource: R) where
R: Resource,
Inserts a resource to the World
, overwriting any previous value of the same type.
See World::insert_resource
for more details.
Note that commands do not take effect immediately.
When possible, prefer the equivalent methods on App
or World
.
Example
commands.insert_resource(Scoreboard {
current_score: 0,
high_score: 0,
});
pub fn remove_resource<R>(&mut self) where
R: Resource,
pub fn remove_resource<R>(&mut self) where
R: Resource,
Removes a resource from the World
.
See World::remove_resource
for more details.
Example
commands.remove_resource::<Scoreboard>();
pub fn add<C>(&mut self, command: C) where
C: Command,
pub fn add<C>(&mut self, command: C) where
C: Command,
Adds a command directly to the command queue.
command
can be a built-in command, custom struct that implements Command
or a closure
that takes &mut World
as an argument.
Example
#[derive(Default)]
struct Counter(u64);
struct AddToCounter(u64);
impl Command for AddToCounter {
fn write(self, world: &mut World) {
let mut counter = world.get_resource_or_insert_with(Counter::default);
counter.0 += self.0;
}
}
fn add_three_to_counter_system(mut commands: Commands) {
commands.add(AddToCounter(3));
}
fn add_twenty_five_to_counter_system(mut commands: Commands) {
commands.add(|world: &mut World| {
let mut counter = world.get_resource_or_insert_with(Counter::default);
counter.0 += 25;
});
}
Trait Implementations
impl<'w, 's> SystemParam for Commands<'w, 's>
impl<'w, 's> SystemParam for Commands<'w, 's>
type Fetch = CommandQueue
Auto Trait Implementations
impl<'w, 's> RefUnwindSafe for Commands<'w, 's>
impl<'w, 's> Send for Commands<'w, 's>
impl<'w, 's> Sync for Commands<'w, 's>
impl<'w, 's> Unpin for Commands<'w, 's>
impl<'w, 's> !UnwindSafe for Commands<'w, 's>
Blanket Implementations
impl<T, U> AsBindGroupShaderType<U> for T where
U: ShaderType,
&'a T: for<'a> Into<U>,
impl<T, U> AsBindGroupShaderType<U> for T where
U: ShaderType,
&'a T: for<'a> Into<U>,
fn as_bind_group_shader_type(
&self,
_images: &HashMap<Handle<Image>, <Image as RenderAsset>::PreparedAsset, RandomState, Global>
) -> U
fn as_bind_group_shader_type(
&self,
_images: &HashMap<Handle<Image>, <Image as RenderAsset>::PreparedAsset, RandomState, Global>
) -> U
Return the T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist. Read more
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<T> Downcast for T where
T: Any,
impl<T> Downcast for T where
T: Any,
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
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
. Read more
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
fn as_any(&self) -> &(dyn Any + 'static)
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. Read more
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
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. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
fn instrument(self, span: Span) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
T: Future, type Output = <T as Future>::Output;
sourcefn in_current_span(self) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
fn in_current_span(self) -> Instrumented<Self>ⓘNotable traits for Instrumented<T>impl<T> Future for Instrumented<T> where
T: Future, type Output = <T as Future>::Output;
T: Future, type Output = <T as Future>::Output;
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>ⓘNotable traits for WithDispatch<T>impl<T> Future for WithDispatch<T> where
T: Future, type Output = <T as Future>::Output;
where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>ⓘNotable traits for WithDispatch<T>impl<T> Future for WithDispatch<T> where
T: Future, type Output = <T as Future>::Output;
where
S: Into<Dispatch>,
T: Future, type Output = <T as Future>::Output;
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>ⓘNotable traits for WithDispatch<T>impl<T> Future for WithDispatch<T> where
T: Future, type Output = <T as Future>::Output;
fn with_current_subscriber(self) -> WithDispatch<Self>ⓘNotable traits for WithDispatch<T>impl<T> Future for WithDispatch<T> where
T: Future, type Output = <T as Future>::Output;
T: Future, type Output = <T as Future>::Output;
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more