You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Update调用中切换Bevy矩形的颜色材质?

在Bevy的Update阶段更新矩形颜色材质的方法

要在Update调用中更新这些矩形的颜色材质,你可以按以下步骤操作:

1. 添加标识组件

给每个矩形实体添加自定义组件,标记它们为需要更新颜色的单元格,方便后续精准查询:

#[derive(Component)]
struct Cell {
    row: usize,
    col: usize,
}

2. 优化Setup阶段的材质创建

不要在spawn时重复创建相同颜色的材质,提前生成两种颜色的材质句柄并复用,避免资源冗余:

// 在setup系统中提前创建材质句柄
let purple_mat = materials.add(Color::PURPLE);
let green_mat = materials.add(Color::GREEN);

// 生成实体时,附加Cell组件并使用预创建的材质句柄
commands.spawn(
    (
        Cell { row: row_index, col: col_index },
        MaterialMesh2dBundle {
            mesh: Mesh2dHandle(meshes.add(Rectangle::new(10., 10.))),
            material: if dull_world.is_live(row_index, col_index) {
                purple_mat.clone()
            } else {
                green_mat.clone()
            },
            transform: Transform::from_xyz(
                (row_index as f32 - row_len as f32 / 2.) * 10.,
                (col_index as f32 - col_len as f32 / 2.) * 10.,
                0.0,
            ),
            ..default()
        },
    ),
);

3. 编写Update系统更新颜色

先定义一个资源存储预创建的材质句柄,方便系统全局访问:

#[derive(Resource)]
struct CellMaterials {
    purple: Handle<ColorMaterial>,
    green: Handle<ColorMaterial>,
}

// 在启动系统中初始化该资源
fn setup_materials(mut materials: ResMut<Assets<ColorMaterial>>, mut commands: Commands) {
    let purple = materials.add(Color::PURPLE);
    let green = materials.add(Color::GREEN);
    commands.insert_resource(CellMaterials { purple, green });
}

然后编写更新系统,通过查询匹配实体并切换材质:

fn update_cell_colors(
    mut query: Query<(&Cell, &mut Handle<ColorMaterial>)>,
    dull_world: Res<DullWorld>, // 假设你的DullWorld是全局资源
    materials: Res<Assets<ColorMaterial>>,
    cell_materials: Res<CellMaterials>,
) {
    for (cell, mut mat_handle) in query.iter_mut() {
        let is_live = dull_world.is_live(cell.row, cell.col);
        // 获取目标材质句柄
        let target_mat = if is_live {
            cell_materials.purple.clone()
        } else {
            cell_materials.green.clone()
        };
        // 检查当前颜色是否与目标一致,避免无意义的更新
        let current_color = materials.get(mat_handle).unwrap().color;
        let target_color = materials.get(&target_mat).unwrap().color;
        
        if current_color != target_color {
            *mat_handle = target_mat;
        }
    }
}

4. 注册系统到App

在App构建代码中添加启动系统和更新系统:

App::new()
    // ... 其他插件、资源初始化
    .add_startup_system(setup_materials)
    .add_startup_system(your_existing_setup_system) // 你原有的setup系统
    .add_system(update_cell_colors)
    // ...
    .run();

关键注意点

  • 用自定义组件标记目标实体,确保查询只针对需要更新的矩形
  • 复用材质句柄,避免频繁创建新材质导致的性能损耗
  • 先校验当前颜色状态,减少不必要的组件修改操作

内容的提问来源于stack exchange,提问作者kemicofa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:27:25