Как в Bevy Engine использовать запросы & mut в системе для каждой?
При расширении базового примера с изменением компонента я попытался добавить &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: &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();
}
Глядя на систему Into foreach, я признаю, что не совсем понимаю, как и почему это не работает, так что, возможно, мне не хватает чего-то базового!
Я сделал простую ошибку? Люди делают что-то, чтобы обойти это?
Благодарность!
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<T>
указатели исключительно в Bevy ECS, потому что они позволяют нам отслеживать, когда компонент был изменен. Это то, что заставляет наши запросы "отслеживания изменений" работать.
Запрос<& mut T> на самом деле также возвращает Mut<T>
указатель.
На самом деле мы изначально поддерживали &mut T
в для каждой системы, но это возвращает фактический &mut T
ссылка, которая не позволяет нам отслеживать мутации T. Это создает ситуацию, когда люди, использующие &mut T
больше не может доверять результатам "запросов на изменение", например Changed<T>
. Предоставление людям возможности случайно (или намеренно) прервать отслеживание изменений, казалось, не стоит немного более интуитивного&mut T
в системах.
Mut<T>
- это немного нестандартный API, который обеспечивает действительно интересные функции. Это то, что многие новые пользователи однажды заметят и подумают: "Хорошо, это немного странно", но тогда им больше никогда не придется об этом думать.