pub trait Resource:
Send
+ Sync
+ 'static { }
Expand description
A type that can be inserted into a World
as a singleton.
You can access resource data in systems using the Res
and ResMut
system parameters
Only one resource of each type can be stored in a World
at any given time.
§Examples
#[derive(Resource)]
struct MyResource { value: u32 }
world.insert_resource(MyResource { value: 42 });
fn read_resource_system(resource: Res<MyResource>) {
assert_eq!(resource.value, 42);
}
fn write_resource_system(mut resource: ResMut<MyResource>) {
assert_eq!(resource.value, 42);
resource.value = 0;
assert_eq!(resource.value, 0);
}
§!Sync
Resources
A !Sync
type cannot implement Resource
. However, it is possible to wrap a Send
but not Sync
type in SyncCell
or the currently unstable Exclusive
to make it Sync
. This forces only
having mutable access (&mut T
only, never &T
), but makes it safe to reference across multiple
threads.
This will fail to compile since RefCell
is !Sync
.
ⓘ
#[derive(Resource)]
struct NotSync {
counter: RefCell<usize>,
}
This will compile since the RefCell
is wrapped with SyncCell
.
use bevy_utils::synccell::SyncCell;
#[derive(Resource)]
struct ActuallySync {
counter: SyncCell<RefCell<usize>>,
}