[−][src]Struct bevy_ecs::World
An unordered collection of entities, each having any number of distinctly typed components
Similar to HashMap<Entity, Vec<Box<dyn Any>>>
where each Vec
never contains two of the same
type, but far more efficient to traverse.
The components of entities who have the same set of component types are stored in contiguous runs, allowing for extremely fast, cache-friendly iteration.
Fields
archetypes: Vec<Archetype>
Implementations
impl World
[src]
pub fn new() -> World
[src]
Create an empty world
pub fn spawn(&mut self, components: impl DynamicBundle) -> Entity
[src]
Create an entity with certain components
Returns the ID of the newly created entity.
Arguments can be tuples, structs annotated with #[derive(Bundle)]
, or the result of
calling build
on an EntityBuilder
, which is useful if the set of components isn't
statically known. To spawn an entity with only one component, use a one-element tuple like
(x,)
.
Any type that satisfies Send + Sync + 'static
can be used as a component.
Example
let mut world = World::new(); let a = world.spawn((123, "abc")); let b = world.spawn((456, true));
pub fn spawn_as_entity(
&mut self,
entity: Entity,
components: impl DynamicBundle
)
[src]
&mut self,
entity: Entity,
components: impl DynamicBundle
)
Create an entity with the given Entity id and the given components
Arguments can be tuples, structs annotated with #[derive(Bundle)]
, or the result of
calling build
on an EntityBuilder
, which is useful if the set of components isn't
statically known. To spawn an entity with only one component, use a one-element tuple like
(x,)
.
Any type that satisfies Send + Sync + 'static
can be used as a component.
pub fn spawn_batch<I>(
&mut self,
iter: I
) -> SpawnBatchIter<<I as IntoIterator>::IntoIter>ⓘImportant traits for SpawnBatchIter<'_, I>
impl<'_, I> Iterator for SpawnBatchIter<'_, I> where
I: Iterator,
<I as Iterator>::Item: Bundle, type Item = Entity;
where
I: IntoIterator,
<I as IntoIterator>::Item: Bundle,
[src]
&mut self,
iter: I
) -> SpawnBatchIter<<I as IntoIterator>::IntoIter>ⓘ
Important traits for SpawnBatchIter<'_, I>
impl<'_, I> Iterator for SpawnBatchIter<'_, I> where
I: Iterator,
<I as Iterator>::Item: Bundle, type Item = Entity;
I: IntoIterator,
<I as IntoIterator>::Item: Bundle,
Efficiently spawn a large number of entities with the same components
Faster than calling spawn
repeatedly with the same components.
Example
let mut world = World::new(); let entities = world.spawn_batch((0..1_000).map(|i| (i, "abc"))).collect::<Vec<_>>(); for i in 0..1_000 { assert_eq!(*world.get::<i32>(entities[i]).unwrap(), i as i32); }
pub fn despawn(&mut self, entity: Entity) -> Result<(), NoSuchEntity>
[src]
Destroy an entity and all its components
pub fn reserve<T>(&mut self, additional: u32) where
T: Bundle,
[src]
T: Bundle,
Ensure additional
entities with exact components T
can be spawned without reallocating
pub fn clear(&mut self)
[src]
Despawn all entities
Preserves allocated storage for reuse.
pub fn contains(&self, entity: Entity) -> bool
[src]
Whether entity
still exists
pub fn query<Q>(&self) -> QueryBorrow<Q> where
Q: Query,
[src]
Q: Query,
Efficiently iterate over all entities that have certain components
Calling iter
on the returned value yields (Entity, Q)
tuples, where Q
is some query
type. A query type is &T
, &mut T
, a tuple of query types, or an Option
wrapping a
query type, where T
is any component type. Components queried with &mut
must only appear
once. Entities which do not have a component type referenced outside of an Option
will be
skipped.
Entities are yielded in arbitrary order.
The returned QueryBorrow
can be further transformed with combinator methods; see its
documentation for details.
Iterating a query will panic if it would violate an existing unique reference or construct an invalid unique reference. This occurs when two simultaneously-active queries could expose the same entity. Simultaneous queries can access the same component type if and only if the world contains no entities that have all components required by both queries, assuming no other component borrows are outstanding.
Iterating a query yields references with lifetimes bound to the QueryBorrow
returned
here. To ensure those are invalidated, the return value of this method must be dropped for
its dynamic borrows from the world to be released. Similarly, lifetime rules ensure that
references obtained from a query cannot outlive the QueryBorrow
.
Example
let mut world = World::new(); let a = world.spawn((123, true, "abc")); let b = world.spawn((456, false)); let c = world.spawn((42, "def")); let entities = world.query::<(Entity, &i32, &bool)>() .iter() .map(|(e, &i, &b)| (e, i, b)) // Copy out of the world .collect::<Vec<_>>(); assert_eq!(entities.len(), 2); assert!(entities.contains(&(a, 123, true))); assert!(entities.contains(&(b, 456, false)));
pub fn query_one<Q>(&self, entity: Entity) -> Result<QueryOne<Q>, NoSuchEntity> where
Q: Query,
[src]
Q: Query,
Prepare a query against a single entity
Call get
on the resulting QueryOne
to actually execute the query. The QueryOne
value
is responsible for releasing the dynamically-checked borrow made by get
, so it can't be
dropped while references returned by get
are live.
Handy for accessing multiple components simultaneously.
Example
let mut world = World::new(); let a = world.spawn((123, true, "abc")); // The returned query must outlive the borrow made by `get` let mut query = world.query_one::<(&mut i32, &bool)>(a).unwrap(); let (mut number, flag) = query.get().unwrap(); if *flag { *number *= 2; } assert_eq!(*number, 246);
pub fn get<T>(&self, entity: Entity) -> Result<Ref<T>, ComponentError> where
T: Component,
[src]
T: Component,
Borrow the T
component of entity
Panics if the component is already uniquely borrowed from another entity with the same components.
pub fn get_mut<T>(&self, entity: Entity) -> Result<RefMut<T>, ComponentError> where
T: Component,
[src]
T: Component,
Uniquely borrow the T
component of entity
Panics if the component is already borrowed from another entity with the same components.
pub fn entity(&self, entity: Entity) -> Result<EntityRef, NoSuchEntity>
[src]
Access an entity regardless of its component types
Does not immediately borrow any component.
pub fn iter(&self) -> Iterⓘ
[src]
Iterate over all entities in the world
Entities are yielded in arbitrary order. Prefer World::query
for better performance when
components will be accessed in predictable patterns.
Example
let mut world = World::new(); let a = world.spawn(()); let b = world.spawn(()); let ids = world.iter().map(|(id, _)| id).collect::<Vec<_>>(); assert_eq!(ids.len(), 2); assert!(ids.contains(&a)); assert!(ids.contains(&b));
pub fn removed<C>(&self) -> &[Entity] where
C: Component,
[src]
C: Component,
pub fn insert(
&mut self,
entity: Entity,
components: impl DynamicBundle
) -> Result<(), NoSuchEntity>
[src]
&mut self,
entity: Entity,
components: impl DynamicBundle
) -> Result<(), NoSuchEntity>
Add components
to entity
Computational cost is proportional to the number of components entity
has. If an entity
already has a component of a certain type, it is dropped and replaced.
When inserting a single component, see insert_one
for convenience.
Example
let mut world = World::new(); let e = world.spawn((123, "abc")); world.insert(e, (456, true)); assert_eq!(*world.get::<i32>(e).unwrap(), 456); assert_eq!(*world.get::<bool>(e).unwrap(), true);
pub fn insert_one(
&mut self,
entity: Entity,
component: impl Component
) -> Result<(), NoSuchEntity>
[src]
&mut self,
entity: Entity,
component: impl Component
) -> Result<(), NoSuchEntity>
Add component
to entity
See insert
.
pub fn remove<T>(&mut self, entity: Entity) -> Result<T, ComponentError> where
T: Bundle,
[src]
T: Bundle,
Remove components from entity
Computational cost is proportional to the number of components entity
has. The entity
itself is not removed, even if no components remain; use despawn
for that. If any
component in T
is not present in entity
, no components are removed and an error is
returned.
When removing a single component, see remove_one
for convenience.
Example
let mut world = World::new(); let e = world.spawn((123, "abc", true)); assert_eq!(world.remove::<(i32, &str)>(e), Ok((123, "abc"))); assert!(world.get::<i32>(e).is_err()); assert!(world.get::<&str>(e).is_err()); assert_eq!(*world.get::<bool>(e).unwrap(), true);
pub fn remove_one<T>(&mut self, entity: Entity) -> Result<T, ComponentError> where
T: Component,
[src]
T: Component,
Remove the T
component from entity
See remove
.
pub unsafe fn get_unchecked<T>(
&self,
entity: Entity
) -> Result<&T, ComponentError> where
T: Component,
[src]
&self,
entity: Entity
) -> Result<&T, ComponentError> where
T: Component,
Borrow the T
component of entity
without safety checks
Should only be used as a building block for safe abstractions.
Safety
entity
must have been previously obtained from this World
, and no unique borrow of the
same component of entity
may be live simultaneous to the returned reference.
pub unsafe fn get_unchecked_mut<T>(
&self,
entity: Entity
) -> Result<&mut T, ComponentError> where
T: Component,
[src]
&self,
entity: Entity
) -> Result<&mut T, ComponentError> where
T: Component,
Uniquely borrow the T
component of entity
without safety checks
Should only be used as a building block for safe abstractions.
Safety
entity
must have been previously obtained from this World
, and no borrow of the same
component of entity
may be live simultaneous to the returned reference.
pub fn archetypes(&self) -> impl ExactSizeIterator
[src]
Inspect the archetypes that entities are organized into
Useful for dynamically scheduling concurrent queries by checking borrows in advance. Does not provide access to entities.
pub fn archetypes_generation(&self) -> ArchetypesGeneration
[src]
Returns a distinct value after archetypes
is changed
Store the current value after deriving information from archetypes
, then check whether the
value returned by this function differs before attempting an operation that relies on its
correctness. Useful for determining whether e.g. a concurrent query execution plan is still
correct.
The generation may be, but is not necessarily, changed as a result of adding or removing any entity or component.
Example
let mut world = World::new(); let initial_gen = world.archetypes_generation(); world.spawn((123, "abc")); assert_ne!(initial_gen, world.archetypes_generation());
pub fn get_entity_location(&self, entity: Entity) -> Option<Location>
[src]
Retrieves the entity's current location, if it exists
pub fn clear_trackers(&mut self)
[src]
Clears each entity's tracker state. For example, each entity's component "mutated" state will be reset to false
.
Trait Implementations
impl Default for World
[src]
impl<A> Extend<A> for World where
A: DynamicBundle,
[src]
A: DynamicBundle,
fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = A>,
[src]
T: IntoIterator<Item = A>,
fn extend_one(&mut self, item: A)
[src]
fn extend_reserve(&mut self, additional: usize)
[src]
impl<A> FromIterator<A> for World where
A: DynamicBundle,
[src]
A: DynamicBundle,
fn from_iter<I>(iter: I) -> World where
I: IntoIterator<Item = A>,
[src]
I: IntoIterator<Item = A>,
impl<'a> IntoIterator for &'a World
[src]
type IntoIter = Iter<'a>
Which kind of iterator are we turning this into?
type Item = (Entity, EntityRef<'a>)
The type of the elements being iterated over.
fn into_iter(self) -> Iter<'a>ⓘ
[src]
impl Send for World
[src]
impl Sync for World
[src]
impl WorldBuilderSource for World
[src]
fn build(&mut self) -> WorldBuilder
[src]
Auto Trait Implementations
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Component for T where
T: 'static + Send + Sync,
[src]
T: 'static + Send + Sync,
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,