如何解决在Bevy Engine中,如何在for-each系统中使用&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 system,我承认我不完全了解这种方法为何或为什么不起作用,所以也许我缺少一些基本知识!
我犯了一个简单的错误吗?人们在做事情来解决这个问题吗?
谢谢!
解决方法
我们选择在Bevy ECS中专门使用Mut<T>
指针,因为它们使我们可以在组件更改时进行跟踪。这就是使我们的“更改跟踪”查询起作用的原因。
Query 实际上还返回一个Mut<T>
指针。
我们实际上最初在for-each系统中支持&mut T
,但这会返回实际的&mut T
参考,这会阻止我们跟踪T的突变。这会导致人们使用{{1} }不再信任&mut T
之类的“更改查询”的结果。使人们具有偶然(或有意)突破变更跟踪的能力似乎不值得在系统中稍微直观一点的Changed<T>
。
&mut T
是一个稍微不标准的api,它启用了非常酷的功能。许多新用户会一次想到它,并认为“好,那有点奇怪”,但随后他们就无需再考虑了。
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中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。