B0002

为了保持Rust 关于引用规则(一个可变引用或任意数量的不可变引用)在资源上,如果在一个系统中存在一个可变资源,就不可能存在不止一个同类资源。 这可能发生在Res<T>ResMut<T> 之间,它们都是针对同一个 T,或在 NonSend<T>NonSendMut<T> 之间,它们都是针对同一个 T

错误代码示例

use bevy::prelude::*;

fn update_materials(
    mut material_updater: ResMut<Assets<StandardMaterial>>,
    current_materials: Res<Assets<StandardMaterial>>,
) {
    // ...
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Update, update_materials)
        .run();
}

这会导致崩溃,因为无法同时在 Assets<StandardMaterial> 上拥有可变资源和不可变资源。

由于可变资源已经提供了对当前资源值的访问权限,因此可以删除不可变资源。

use bevy::prelude::*;

fn update_materials(
    mut material_updater: ResMut<Assets<StandardMaterial>>,
) {
    // ...
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Update, update_materials)
        .run();
}