Struct EntityCloner

Source
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):

  1. local overrides using EntityClonerBuilder::override_clone_behavior
  2. component-defined handler using Component::clone_behavior
  3. default handler override using EntityClonerBuilder::with_default_clone_fn.
  4. reflect-based or noop default clone handler depending on if bevy_reflect feature is enabled or not.

Implementations§

Source§

impl EntityCloner

Source

pub fn build(world: &mut World) -> EntityClonerBuilder<'_>

Returns a new EntityClonerBuilder using the given world.

Source

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”.

Source

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

Source

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

Source

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

Source§

fn default() -> EntityCloner

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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 T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

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.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert 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)

Convert &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)

Convert &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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromWorld for T
where T: Default,

Source§

fn from_world(_world: &mut World) -> T

Creates Self using default().

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more