Struct bevy::ecs::component::Components
pub struct Components { /* private fields */ }
Implementations§
§impl Components
impl Components
pub fn init_component<T>(&mut self, storages: &mut Storages) -> ComponentIdwhere
T: Component,
pub fn init_component<T>(&mut self, storages: &mut Storages) -> ComponentIdwhere
T: Component,
Initializes a component of type T
with this instance.
If a component of this type has already been initialized, this will return
the ID of the pre-existing component.
§See also
pub fn init_component_with_descriptor(
&mut self,
storages: &mut Storages,
descriptor: ComponentDescriptor
) -> ComponentId
pub fn init_component_with_descriptor( &mut self, storages: &mut Storages, descriptor: ComponentDescriptor ) -> ComponentId
pub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if there are no components registered with this instance. Otherwise, this returns false
.
pub fn get_info(&self, id: ComponentId) -> Option<&ComponentInfo>
pub fn get_info(&self, id: ComponentId) -> Option<&ComponentInfo>
Gets the metadata associated with the given component.
This will return an incorrect result if id
did not come from the same world as self
. It may return None
or a garbage value.
Examples found in repository?
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
fn main() {
let mut world = World::new();
let mut lines = std::io::stdin().lines();
let mut component_names = HashMap::<String, ComponentId>::new();
let mut component_info = HashMap::<ComponentId, ComponentInfo>::new();
println!("{}", PROMPT);
loop {
print!("\n> ");
let _ = std::io::stdout().flush();
let Some(Ok(line)) = lines.next() else {
return;
};
if line.is_empty() {
return;
};
let Some((first, rest)) = line.trim().split_once(|c: char| c.is_whitespace()) else {
match &line.chars().next() {
Some('c') => println!("{}", COMPONENT_PROMPT),
Some('s') => println!("{}", ENTITY_PROMPT),
Some('q') => println!("{}", QUERY_PROMPT),
_ => println!("{}", PROMPT),
}
continue;
};
match &first[0..1] {
"c" => {
rest.split(',').for_each(|component| {
let mut component = component.split_whitespace();
let Some(name) = component.next() else {
return;
};
let size = match component.next().map(|s| s.parse::<usize>()) {
Some(Ok(size)) => size,
_ => 0,
};
// Register our new component to the world with a layout specified by it's size
// SAFETY: [u64] is Send + Sync
let id = world.init_component_with_descriptor(unsafe {
ComponentDescriptor::new_with_layout(
name.to_string(),
StorageType::Table,
Layout::array::<u64>(size).unwrap(),
None,
)
});
let Some(info) = world.components().get_info(id) else {
return;
};
component_names.insert(name.to_string(), id);
component_info.insert(id, info.clone());
println!("Component {} created with id: {:?}", name, id.index());
});
}
"s" => {
let mut to_insert_ids = Vec::new();
let mut to_insert_data = Vec::new();
rest.split(',').for_each(|component| {
let mut component = component.split_whitespace();
let Some(name) = component.next() else {
return;
};
// Get the id for the component with the given name
let Some(&id) = component_names.get(name) else {
println!("Component {} does not exist", name);
return;
};
// Calculate the length for the array based on the layout created for this component id
let info = world.components().get_info(id).unwrap();
let len = info.layout().size() / std::mem::size_of::<u64>();
let mut values: Vec<u64> = component
.take(len)
.filter_map(|value| value.parse::<u64>().ok())
.collect();
values.resize(len, 0);
// Collect the id and array to be inserted onto our entity
to_insert_ids.push(id);
to_insert_data.push(values);
});
let mut entity = world.spawn_empty();
// Construct an `OwningPtr` for each component in `to_insert_data`
let to_insert_ptr = to_owning_ptrs(&mut to_insert_data);
// SAFETY:
// - Component ids have been taken from the same world
// - Each array is created to the layout specified in the world
unsafe {
entity.insert_by_ids(&to_insert_ids, to_insert_ptr.into_iter());
}
println!("Entity spawned with id: {:?}", entity.id());
}
"q" => {
let mut builder = QueryBuilder::<FilteredEntityMut>::new(&mut world);
parse_query(rest, &mut builder, &component_names);
let mut query = builder.build();
query.iter_mut(&mut world).for_each(|filtered_entity| {
let terms = filtered_entity
.components()
.map(|id| {
let ptr = filtered_entity.get_by_id(id).unwrap();
let info = component_info.get(&id).unwrap();
let len = info.layout().size() / std::mem::size_of::<u64>();
// SAFETY:
// - All components are created with layout [u64]
// - len is calculated from the component descriptor
let data = unsafe {
std::slice::from_raw_parts_mut(
ptr.assert_unique().as_ptr().cast::<u64>(),
len,
)
};
// If we have write access, increment each value once
if filtered_entity.access().has_write(id) {
data.iter_mut().for_each(|data| {
*data += 1;
});
}
format!("{}: {:?}", info.name(), data[0..len].to_vec())
})
.collect::<Vec<_>>()
.join(", ");
println!("{:?}: {}", filtered_entity.id(), terms);
});
}
_ => continue,
}
}
}
pub fn get_name(&self, id: ComponentId) -> Option<&str>
pub fn get_name(&self, id: ComponentId) -> Option<&str>
Returns the name associated with the given component.
This will return an incorrect result if id
did not come from the same world as self
. It may return None
or a garbage value.
pub unsafe fn get_info_unchecked(&self, id: ComponentId) -> &ComponentInfo
pub unsafe fn get_info_unchecked(&self, id: ComponentId) -> &ComponentInfo
pub fn get_id(&self, type_id: TypeId) -> Option<ComponentId>
pub fn get_id(&self, type_id: TypeId) -> Option<ComponentId>
Type-erased equivalent of Components::component_id()
.
pub fn component_id<T>(&self) -> Option<ComponentId>where
T: Component,
pub fn component_id<T>(&self) -> Option<ComponentId>where
T: Component,
Returns the ComponentId
of the given Component
type T
.
The returned ComponentId
is specific to the Components
instance
it was retrieved from and should not be used with another Components
instance.
Returns None
if the Component
type has not
yet been initialized using Components::init_component()
.
use bevy_ecs::prelude::*;
let mut world = World::new();
#[derive(Component)]
struct ComponentA;
let component_a_id = world.init_component::<ComponentA>();
assert_eq!(component_a_id, world.components().component_id::<ComponentA>().unwrap())
§See also
pub fn get_resource_id(&self, type_id: TypeId) -> Option<ComponentId>
pub fn get_resource_id(&self, type_id: TypeId) -> Option<ComponentId>
Type-erased equivalent of Components::resource_id()
.
pub fn resource_id<T>(&self) -> Option<ComponentId>where
T: Resource,
pub fn resource_id<T>(&self) -> Option<ComponentId>where
T: Resource,
Returns the ComponentId
of the given Resource
type T
.
The returned ComponentId
is specific to the Components
instance
it was retrieved from and should not be used with another Components
instance.
Returns None
if the Resource
type has not
yet been initialized using Components::init_resource()
.
use bevy_ecs::prelude::*;
let mut world = World::new();
#[derive(Resource, Default)]
struct ResourceA;
let resource_a_id = world.init_resource::<ResourceA>();
assert_eq!(resource_a_id, world.components().resource_id::<ResourceA>().unwrap())
§See also
pub fn init_resource<T>(&mut self) -> ComponentIdwhere
T: Resource,
pub fn init_resource<T>(&mut self) -> ComponentIdwhere
T: Resource,
pub fn init_non_send<T>(&mut self) -> ComponentIdwhere
T: Any,
pub fn init_non_send<T>(&mut self) -> ComponentIdwhere
T: Any,
Initializes a non-send resource of type T
with this instance.
If a resource of this type has already been initialized, this will return
the ID of the pre-existing resource.
pub fn iter(&self) -> impl Iterator<Item = &ComponentInfo>
pub fn iter(&self) -> impl Iterator<Item = &ComponentInfo>
Gets an iterator over all components registered with this instance.
Trait Implementations§
§impl Debug for Components
impl Debug for Components
§impl Default for Components
impl Default for Components
§fn default() -> Components
fn default() -> Components
§impl<'a> SystemParam for &'a Components
impl<'a> SystemParam for &'a Components
§type Item<'w, 's> = &'w Components
type Item<'w, 's> = &'w Components
Self
, instantiated with new lifetimes. Read more§fn init_state(
_world: &mut World,
_system_meta: &mut SystemMeta
) -> <&'a Components as SystemParam>::State
fn init_state( _world: &mut World, _system_meta: &mut SystemMeta ) -> <&'a Components as SystemParam>::State
World
access used by this SystemParam
and creates a new instance of this param’s State
.§unsafe fn get_param<'w, 's>(
_state: &'s mut <&'a Components as SystemParam>::State,
_system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
_change_tick: Tick
) -> <&'a Components as SystemParam>::Item<'w, 's>
unsafe fn get_param<'w, 's>( _state: &'s mut <&'a Components as SystemParam>::State, _system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, _change_tick: Tick ) -> <&'a Components as SystemParam>::Item<'w, 's>
SystemParamFunction
. Read more§fn new_archetype(
_state: &mut Self::State,
_archetype: &Archetype,
_system_meta: &mut SystemMeta
)
fn new_archetype( _state: &mut Self::State, _archetype: &Archetype, _system_meta: &mut SystemMeta )
Archetype
, registers the components accessed by this SystemParam
(if applicable).§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 apply_deferred
.impl<'a> ReadOnlySystemParam for &'a Components
Auto Trait Implementations§
impl RefUnwindSafe for Components
impl Send for Components
impl Sync for Components
impl Unpin for Components
impl UnwindSafe for Components
Blanket Implementations§
§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
§fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> 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
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§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
.§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
.§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.§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.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Self
using data from the given World
.