pub struct EntityCloner { /* private fields */ }
Expand description
A configuration determining how to clone entities. This can be built using EntityCloner::build
, which
returns an EntityClonerBuilder
.
After configuration is complete an entity can be cloned using Self::clone_entity
.
use bevy_ecs::prelude::*;
use bevy_ecs::entity::EntityCloner;
#[derive(Component, Clone, PartialEq, Eq)]
struct A {
field: usize,
}
let mut world = World::default();
let component = A { field: 5 };
let entity = world.spawn(component.clone()).id();
let entity_clone = world.spawn_empty().id();
EntityCloner::build(&mut world).clone_entity(entity, entity_clone);
assert!(world.get::<A>(entity_clone).is_some_and(|c| *c == component));
§Default cloning strategy
By default, all types that derive Component
and implement either Clone
or Reflect
(with ReflectComponent
) will be cloned
(with Clone
-based implementation preferred in case component implements both).
It should be noted that if Component
is implemented manually or if Clone
implementation is conditional
(like when deriving Clone
for a type with a generic parameter without Clone
bound),
the component will be cloned using the default cloning strategy.
To use Clone
-based handler (ComponentCloneBehavior::clone
) in this case it should be set manually using one
of the methods mentioned in the Clone Behaviors section
Here’s an example of how to do it using clone_behavior
:
#[derive(Clone)]
struct SomeComponent;
impl Component for SomeComponent {
const STORAGE_TYPE: StorageType = StorageType::Table;
type Mutability = Mutable;
fn clone_behavior() -> ComponentCloneBehavior {
ComponentCloneBehavior::clone::<Self>()
}
}
§Clone Behaviors
EntityCloner
clones entities by cloning components using ComponentCloneBehavior
, and there are multiple layers
to decide which handler to use for which component. The overall hierarchy looks like this (priority from most to least):
- local overrides using
EntityClonerBuilder::override_clone_behavior
- component-defined handler using
Component::clone_behavior
- default handler override using
EntityClonerBuilder::with_default_clone_fn
. - reflect-based or noop default clone handler depending on if
bevy_reflect
feature is enabled or not.
Implementations§
Source§impl EntityCloner
impl EntityCloner
Sourcepub fn build(world: &mut World) -> EntityClonerBuilder<'_>
pub fn build(world: &mut World) -> EntityClonerBuilder<'_>
Returns a new EntityClonerBuilder
using the given world
.
Sourcepub fn linked_cloning(&self) -> bool
pub fn linked_cloning(&self) -> bool
Returns true
if this cloner is configured to clone entities referenced in cloned components via RelationshipTarget::LINKED_SPAWN
.
This will produce “deep” / recursive clones of relationship trees that have “linked spawn”.
Sourcepub fn clone_entity(
&mut self,
world: &mut World,
source: Entity,
target: Entity,
)
pub fn clone_entity( &mut self, world: &mut World, source: Entity, target: Entity, )
Clones and inserts components from the source
entity into target
entity using the stored configuration.
If this EntityCloner
has EntityCloner::linked_cloning
, then it will recursively spawn entities as defined
by RelationshipTarget
components with
RelationshipTarget::LINKED_SPAWN
Sourcepub fn spawn_clone(&mut self, world: &mut World, source: Entity) -> Entity
pub fn spawn_clone(&mut self, world: &mut World, source: Entity) -> Entity
Clones and inserts components from the source
entity into a newly spawned entity using the stored configuration.
If this EntityCloner
has EntityCloner::linked_cloning
, then it will recursively spawn entities as defined
by RelationshipTarget
components with
RelationshipTarget::LINKED_SPAWN
Sourcepub fn clone_entity_mapped(
&mut self,
world: &mut World,
source: Entity,
mapper: &mut dyn EntityMapper,
) -> Entity
pub fn clone_entity_mapped( &mut self, world: &mut World, source: Entity, mapper: &mut dyn EntityMapper, ) -> Entity
Clones the entity into whatever entity mapper
chooses for it.
Trait Implementations§
Source§impl Default for EntityCloner
impl Default for EntityCloner
Source§fn default() -> EntityCloner
fn default() -> EntityCloner
Auto Trait Implementations§
impl Freeze for EntityCloner
impl !RefUnwindSafe for EntityCloner
impl !Send for EntityCloner
impl !Sync for EntityCloner
impl Unpin for EntityCloner
impl !UnwindSafe for EntityCloner
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> 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> 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