Как мне использовать запросы

#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 заимствует сущность. В документах здесь.