#rust #bevy
#Ржавчина #bevy
Вопрос:
При расширении базового примера с изменением компонента я попытался добавить amp;mut
к параметру компонента в системе. Однако это вызвало no method "system" found
ошибку.
Мой код здесь:
use bevy::prelude::*;
fn setup(
mut commands: Commands,
asset_server: Res<AssetServer>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
let texture_handle = asset_server.load("icon.png").unwrap();
commands
.spawn(Camera2dComponents::default())
.spawn(SpriteComponents {
material: materials.add(texture_handle.into()),
rotation: Rotation::from_rotation_z(0.0),
..Default::default()
})
.with(Player(0.0))
.with(());
}
struct Player(f32);
fn control_system(keyboard_input: Res<Input<KeyCode>>, player: amp;mut Player) { // <- mut added here
let mut r = player.0;
println!("hello");
/*
if keyboard_input.pressed(KeyCode::Left) {
player.0 = 0.1;
}
if keyboard_input.pressed(KeyCode::Right) {
player.0 -= 0.1;
}
*/
}
fn main() {
App::build()
.add_default_plugins()
.add_startup_system(setup.system())
.add_system(control_system.system())
.run();
}
Заглядывая в foreach system, я признаю, что не до конца понимаю, как или почему это не работает, так что, возможно, я упускаю что-то основное!
Я допустил простую ошибку? Люди что-то делают, чтобы обойти это?
Спасибо!
Ответ №1:
Мы решили использовать Mut<T>
указатели исключительно в EC Bevy, потому что они позволяют нам отслеживать всякий раз, когда компонент изменился. Это то, что заставляет работать наши запросы «отслеживания изменений».
Запрос<amp;mut T> фактически также возвращает Mut<T>
указатель.
На самом деле мы изначально поддерживали amp;mut T
в for-each systems, но это возвращает фактическую amp;mut T
ссылку, которая мешает нам отслеживать мутации T. Это создает ситуацию, когда люди, использующие amp;mut T
, больше не могут доверять результату «запросов на изменение», например Changed<T>
. Предоставление пользователям возможности случайно (или намеренно) отказаться от отслеживания изменений, казалось, не стоило немного более интуитивного amp;mut T
подхода к системам.
Mut<T>
это немного нестандартный api, который предоставляет действительно классные функции. Многие новые пользователи однажды столкнутся с этим и подумают: «хорошо, это немного странно», но тогда им больше никогда не придется думать об этом снова.
Ответ №2:
fn control_system(keyboard_input: Res<Input<KeyCode>>, mut player: Mut<Player>) {
let mut r = player.0;
println!("hello");
}
mut entity: Mut<Entity>
кажется, это формат.
Mut заимствует сущность. В документах здесь.