pub struct EntityAllocator { /* private fields */ }Expand description
Allocates Entity ids uniquely.
This is used in World::spawn_at and World::despawn_no_free to track entity ids no longer in use.
Allocating is fully concurrent and can be done from multiple threads.
Conceptually, this is a collection of Entity ids who’s EntityIndex is despawned and who’s EntityGeneration is the most recent.
See the module docs for how these ids and this allocator participate in the life cycle of an entity.
Implementations§
Source§impl EntityAllocator
impl EntityAllocator
Sourcepub fn free(&mut self, freed: Entity)
pub fn free(&mut self, freed: Entity)
This allows freed to be retrieved from alloc, etc.
Freeing an Entity such that one EntityIndex is in the allocator in multiple places can cause panics when spawning the allocated entity.
Additionally, to differentiate versions of an Entity, updating the EntityGeneration before freeing is a good idea
(but not strictly necessary if you don’t mind Entity id aliasing.)
Sourcepub fn alloc(&self) -> Entity
pub fn alloc(&self) -> Entity
Allocates some Entity.
The result could have come from a free or be a brand new EntityIndex.
The returned entity is valid and unique, but it is not yet spawned.
Using the id as if it were spawned may produce errors.
It can not be queried, and it has no EntityLocation.
See module docs for more information about entity validity vs spawning.
This is different from empty entities, which are spawned and just happen to have no components.
These ids must be used; otherwise, they will be forgotten.
For example, the result must be eventually used to either spawn an entity or be freed.
§Panics
If there are no more entities available, this panics.
§Example
This is particularly useful when spawning entities in special ways.
For example, Commands uses this to allocate an entity and spawn_at it later.
But remember, since this entity is not queryable and is not discoverable, losing the returned Entity effectively leaks it, never to be used again!
let mut world = World::new();
let entity = world.entities_allocator().alloc();
// wait as long as you like
let entity_access = world.spawn_empty_at(entity).unwrap(); // or spawn_at(entity, my_bundle)
// treat it as a normal entity
entity_access.despawn();More generally, manually spawning and despawn_no_freeing entities allows you to skip Bevy’s default entity allocator.
This is useful if you want to enforce properties about the EntityIndexs of a group of entities, make a custom allocator, etc.
Sourcepub fn alloc_many(&self, count: u32) -> AllocEntitiesIterator<'_> ⓘ
pub fn alloc_many(&self, count: u32) -> AllocEntitiesIterator<'_> ⓘ
A more efficient way of calling alloc repeatedly count times.
See alloc for details.
Like alloc, these entities must be used, otherwise they will be forgotten.
If the iterator is not exhausted, its remaining entities are forgotten.
See AllocEntitiesIterator docs for more.
Trait Implementations§
Source§impl Debug for EntityAllocator
impl Debug for EntityAllocator
Source§impl Default for EntityAllocator
impl Default for EntityAllocator
Source§fn default() -> EntityAllocator
fn default() -> EntityAllocator
Source§impl<'a> SystemParam for &'a EntityAllocator
impl<'a> SystemParam for &'a EntityAllocator
Source§type Item<'w, 's> = &'w EntityAllocator
type Item<'w, 's> = &'w EntityAllocator
Self, instantiated with new lifetimes. Read moreSource§fn init_state(_world: &mut World) -> <&'a EntityAllocator as SystemParam>::State
fn init_state(_world: &mut World) -> <&'a EntityAllocator as SystemParam>::State
State.Source§fn init_access(
_state: &<&'a EntityAllocator as SystemParam>::State,
_system_meta: &mut SystemMeta,
_component_access_set: &mut FilteredAccessSet,
_world: &mut World,
)
fn init_access( _state: &<&'a EntityAllocator as SystemParam>::State, _system_meta: &mut SystemMeta, _component_access_set: &mut FilteredAccessSet, _world: &mut World, )
World access used by this SystemParamSource§unsafe fn get_param<'w, 's>(
_state: &'s mut <&'a EntityAllocator as SystemParam>::State,
_system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
_change_tick: Tick,
) -> <&'a EntityAllocator as SystemParam>::Item<'w, 's>
unsafe fn get_param<'w, 's>( _state: &'s mut <&'a EntityAllocator as SystemParam>::State, _system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, _change_tick: Tick, ) -> <&'a EntityAllocator as SystemParam>::Item<'w, 's>
SystemParamFunction. Read moreSource§fn apply(state: &mut Self::State, system_meta: &SystemMeta, world: &mut World)
fn apply(state: &mut Self::State, system_meta: &SystemMeta, world: &mut World)
SystemParam’s state.
This is used to apply Commands during ApplyDeferred.Source§fn queue(
state: &mut Self::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut Self::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred.Source§unsafe fn validate_param(
state: &mut Self::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'_>,
) -> Result<(), SystemParamValidationError>
unsafe fn validate_param( state: &mut Self::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'_>, ) -> Result<(), SystemParamValidationError>
impl<'a> ReadOnlySystemParam for &'a EntityAllocator
Auto Trait Implementations§
impl !Freeze for EntityAllocator
impl RefUnwindSafe for EntityAllocator
impl Send for EntityAllocator
impl Sync for EntityAllocator
impl Unpin for EntityAllocator
impl UnwindSafe for EntityAllocator
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more