[][src]Struct bevy_ecs::World

pub struct World {
    pub archetypes: Vec<Archetype>,
    // some fields omitted
}

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]

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]

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]

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]

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]

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]

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]

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

Important traits for Iter<'a>

impl<'a> Iterator for Iter<'a> type Item = (Entity, EntityRef<'a>);
[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]

pub fn insert(
    &mut self,
    entity: Entity,
    components: impl DynamicBundle
) -> Result<(), NoSuchEntity>
[src]

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]

Add component to entity

See insert.

pub fn remove<T>(&mut self, entity: Entity) -> Result<T, ComponentError> where
    T: Bundle
[src]

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]

Remove the T component from entity

See remove.

pub unsafe fn get_unchecked<T>(
    &self,
    entity: Entity
) -> Result<&T, ComponentError> where
    T: Component
[src]

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]

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]

impl<A> FromIterator<A> for World where
    A: DynamicBundle
[src]

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.

impl Send for World[src]

impl Sync for World[src]

impl WorldBuilderSource for World[src]

Auto Trait Implementations

impl !RefUnwindSafe for World

impl Unpin for World

impl UnwindSafe for World

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Component for T where
    T: 'static + Send + Sync
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,