在 Bevy 引擎中,如何在 for-each 系统中使用 &mut 查询?
In the Bevy Engine, how do I use &mut queries in the for-each system?
在扩展带有组件变异的基本示例时,我尝试将 &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 system 我承认我不完全理解这不起作用的方式或原因,所以也许我遗漏了一些基本的东西!
我犯了一个简单的错误吗?人们正在做一些事情来解决这个问题吗?
谢谢!
fn control_system(keyboard_input: Res<Input<KeyCode>>, mut player: Mut<Player>) {
let mut r = player.0;
println!("hello");
}
mut entity: Mut<Entity>
好像是格式。
Mut 借用了一个实体。在文档中 here.
我们选择在 Bevy ECS 中专门使用 Mut<T>
指针,因为它们可以让我们在组件发生更改时进行跟踪。这就是我们的“更改跟踪”查询起作用的原因。
查询<&mut T>其实也是returns一个Mut<T>
指针。
我们实际上最初在 for-each 系统中支持 &mut T
,但是这个 returns 一个实际的 &mut T
参考,它阻止我们跟踪 T 的突变。这创建了一个使用 &mut T
的人不再相信像 Changed<T>
这样的“更改查询”的结果的情况。让人们能够意外(或有意)打破变更跟踪似乎不值得在系统中稍微更直观 &mut T
。
Mut<T>
有点 non-standard api 可以实现非常酷的功能。许多新用户会点击一次并认为“好吧,这有点奇怪”,但他们再也不需要再考虑了。
在扩展带有组件变异的基本示例时,我尝试将 &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 system 我承认我不完全理解这不起作用的方式或原因,所以也许我遗漏了一些基本的东西!
我犯了一个简单的错误吗?人们正在做一些事情来解决这个问题吗?
谢谢!
fn control_system(keyboard_input: Res<Input<KeyCode>>, mut player: Mut<Player>) {
let mut r = player.0;
println!("hello");
}
mut entity: Mut<Entity>
好像是格式。
Mut 借用了一个实体。在文档中 here.
我们选择在 Bevy ECS 中专门使用 Mut<T>
指针,因为它们可以让我们在组件发生更改时进行跟踪。这就是我们的“更改跟踪”查询起作用的原因。
查询<&mut T>其实也是returns一个Mut<T>
指针。
我们实际上最初在 for-each 系统中支持 &mut T
,但是这个 returns 一个实际的 &mut T
参考,它阻止我们跟踪 T 的突变。这创建了一个使用 &mut T
的人不再相信像 Changed<T>
这样的“更改查询”的结果的情况。让人们能够意外(或有意)打破变更跟踪似乎不值得在系统中稍微更直观 &mut T
。
Mut<T>
有点 non-standard api 可以实现非常酷的功能。许多新用户会点击一次并认为“好吧,这有点奇怪”,但他们再也不需要再考虑了。