如何在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
相关产品推荐
相关产品推荐

