bevy_mod_component_mirror 0.11.0

A bevy plugin to mirror components
bevy_mod_component_mirror-0.11.0 doesn't have any documentation.

Bevy Component Mirrors

Bevy tracking Latest version MIT/Apache 2.0 Documentation

A third party crate to mirror Component values.

By default, it also provides a set of bevy Components mirroring the values of bevy_rapier Components. (Currently only bevy_rapier3d, PRs welcome!) Since some of bevy_rapier Components do not implement Reflect, they may be harder to work with. This crate is especially useful with bevy-inspector-egui, it will allow you to edit rapier values at run time, so you don't have to restart your game repetitively to find the right physics parameters.


  1. Add this crate as a dependency to your Cargo.toml.
bevy_mod_component_mirror = "0.11.0"
  1. Add RapierMirrorsPlugins to your app
use bevy_mod_component_mirror::RapierMirrorsPlugins;

# fn main() {
# let mut app = bevy::prelude::App::new();
  // Notice  v the plural
# }

That's it! Now every Entity with the following rapier (3d) components will automatically have an equivalent XyzMirror component that automatically syncs its value with it.

  • ImpulseJoint
  • Collider (some collider shape are not implemented yet!)
  • ColliderMassProperties
  • AdditionalMassProperties

Implement your own mirrors

If you wish to mirror other components, you need to do the following:

  • Create a Component (eg: ForeignMirror)
  • Implement the Mirror trait for that component.
  • Implement From<&'a Foreign> for ForeignMirror
  • Add MirrorPlugin::<Foreign, ForeignMirror>::new() to your app
use bevy_mod_component_mirror::{Mirror, MirrorPlugin};
use bevy::prelude::*;

# mod foreign_crate {
#   use super::*;
#   #[derive(Component)]
#   pub struct Foreign; impl Foreign {
#   pub fn set_length(&mut self, value: f32) {}
#   pub fn length(&self) -> f32 { 0.0 }
# }}
use foreign_crate::Foreign;

// Component: required because you want it to be a component
// Reflect: this let `MirrorPlugin` register the `Mirror` type itself
#[derive(Component, Reflect)]
pub struct ForeignMirror {
  inner: f32,

// Foreign → ForeignMirror
impl<'a> From<&'a Foreign> for ForeignMirror {
  fn from(value: &'a Foreign) -> Self {
    ForeignMirror {
      inner: value.length(),
// ForeignMirror → Foreign
impl Mirror<Foreign> for ForeignMirror {
  fn apply(&self, value: &mut Foreign) {

fn main() {
  let mut app = App::new();
  app.add_plugins(MirrorPlugin::<Foreign, ForeignMirror>::new());


If you don't need the definitions for the rapier components but still wish to use the mirror plugin, you can disable the rapier components with:

bevy_mod_component_mirror = { version = "0.11.0", default-features = false }

Version matrix

bevy bevy_rapier3d bevy_mod_component_mirror
0.12 0.23.0 0.11.0
0.11 0.22.0 0.10.0
0.10 0.21.0 0.9
0.9 0.20.0 0.7

Change log

  • 0.11: BREAKING: Bump to bevy 0.12 & rapier 0.23
  • 0.10: BREAKING: Bump to bevy 0.11 & rapier 0.22 (Thanks Naomijub on GitHub, See #3)
  • 0.9: Fix a compilation error which source is currently unknown


Consider moving .git/hooks/pre-commit.sample to .git/hooks/pre-commit.sample, and adding the following lines before the last exec one:

if ! make pre-hook ; then
  echo Error: Some pre-commit checks did not pass!
  exit 1


Copyright © 2022 Nicola Papale

This software is licensed under either MIT or Apache 2.0 at your leisure. See licenses directory for details.