created_at2022-06-09 19:24:00.257947
updated_at2022-09-28 11:26:09.059783
descriptionplugin for drawing floating stat bars




Bevy crate for drawing floating statbars like health bars above enemy sprites etc.

Version 0.3

  • Supports Bevy 0.8

New in this release

  • Completely rewritten. New design and API.
  • Should (hopefully) be easier to use, the redesign seems better to me but let me know if you hate the changes.
  • (Seems to) Work nicely with bevy_inspector_egui now.
  • Removed the arbitrary orientation stuff temporarily, just has reversible horizontal and vertical bars.
  • Statbars can track resources as well as components.
  • No plugin, need to add an observer to your Bevy ```App`` for each type of Statbar before they will draw.
  • Multiple Statbar components on one entity implemented using PhantomData. This requires /media/example.png

How to use

Add the dependency to your Cargo.toml file with

version = "0.3"

Then register any components you want to observe with a statbar with your Bevy App:

use bevy_stat_bars::*;

    // ..etc, rest of app

You also need to implement the StatbarObservable trait on those components:

impl StatbarObservable for HitPoints {
    fn get_statbar_value(&self) -> f32 {
        self.value / self.max

And now you can add a Statbar::<HitPoints> component to an entity to visualize its HitPoints component

        Statbar::<HitPoints> {
            empty_color: Color::NAVY,
            length: 10.,
            thickness: 2.,
            displacement: 8. * Vec2::Y,
        StatbarBorder::<HitPoints>::all(Color::WHITE, 1.),



There are six examples you can look at that cover most of the features and use cases, run them with

cargo run --example minimal_standalone
cargo run --example basic_interactive
cargo run --example observe_resource
cargo run --example demo
cargo run --example stress --release
cargo run --example stress2 --release

The demo example is the probably the most useful to look at.

The stress2 example uses macros to add hundreds of marker types and can take a few minutes to compile.


  • Only supports 2D.

  • When I was writing the examples I made a mistake where instead of


    I used


    which is quite easy to miss. The crate fails silently and just won't render anything in this case, leaving the user with a frustrating bug hunt.

    Likewise also when a statbar is set to observe its parent or another Entity that doesn't exist, it will render a statbar that doesn't update.

  • Statbars are drawn using Sprites with a z depth of 990, and if you translate the camera down more than 10 units they won't draw. You can change the depth with the StatbarDepth resource.

    So with


    all Statbars will now render with a z depth of 500. There currently isn't any way to control the ordering in which the individual statbars are drawn.

  • Still uses sprites for rendering which isn't ideal but performance seems fine. You can run the stress example to see what its like under a heavy load. I get about 100fps on my rx580.

  • add_statbar_component_observer adds six systems to your Bevy app per component observed. Again not ideal but doesn't seem to be a problem. I get ~100fps with the stress2 example which spawns 100 entities with 200 Statbars each.

Future Plans

  • Replace the sprite based rendering with a custom renderer. I have some fragment shaders already written, and should be better performance with some nice effects like rounded corners and color gradients.

  • Pie-o-meters

  • Labels and numeric indicators

  • Some sort of, posibly feature gated or debug-only, falure detection that gives an error when you insert unregistered statbars, or when a statbar can't find the component it is meant to be observing.

  • Derive macro for StatbarObservable.

  • Auto arrangement/stacking of groups of statbars. I thought this would be more difficult but I dreamt up an easyish way to do it last night.

Commit count: 20

cargo fmt