Как в 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, который обеспечивает действительно интересные функции. Это то, что многие новые пользователи однажды заметят и подумают: "Хорошо, это немного странно", но тогда им больше никогда не придется об этом думать.

Другие вопросы по тегам